FROM절 Subquery
내가 오늘 사용할 패널 데이터의 칼럼은 아래와 같다
RNUM, SEL_DATE, OS, APP_NAME, PANEL_NO, SEX, AGE, PANEL_FLAG, DURATION, N_FACTOR, P_FACTOR, APP_CNT, TELECOM, SDK_VERSION, TTS, TTS_percentage
FROM절 서브쿼리는 자주 쓰기 때문에 잘 알아둬야 한다. 서브쿼리 하나로 테이블을 만들고, 그 테이블에서 가공하는 데이터를 뽑을 때 사용하면 되는 것 같다. FROM절 서브쿼리도 단계별로 생각을 해야하기 때문에 많은 예시를 접해서 내꺼로 만드는 게 필요할 것 같다.
FROM절 서브쿼리
Q. 카카오스토리앱의 TELECOM 별 총 UU 평균 구하기.
1. 먼저 통신사 별 총 UU를 구하는 테이블을 만든다.
select TELECOM, SUM(N_FACTOR)
from sys.panel_data
group by TELECOM;
Result
TELECOM | SUM(N_FACTOR) |
---|---|
etc | 101371.5505 |
KT | 789832.1857399998 |
SK | 1326141.3175100016 |
LG | 585589.8138199996 |
2. 위의 테이블에서 이제 ‘평균’을 구한다.
여기서 주의해야 하는 부분은 from절 내의 서브쿼리에 ALIAS를 붙여줘야한다는 것이다.
select avg(UU)
from(
--- 통신사별 총UU 계산
select TELECOM
,SUM(N_FACTOR) UU
from sys.panel_data
group by TELECOM
) as weekly_UU;
Result: TELECOM별 UU의 평균을 잘 뽑아왔다.
avg(UU) |
---|
700733.7168925002 |
***참고: 위의 FROM절 서브쿼리를 WITH절로도 바꿀 수 있다. WITH절을 사용할 때 아래와 형식을 지켜주면 된다. WITH절은 마치 테이블이 있는 것처럼 동작하게끔 하고, 테이블이 생기지는 않는다. 그래서 원할때마다 꺼내 쓸 수 있는 테이블은 아니라는 점 명심.
WITH 별칭 AS (
...
)
WITH weekly_UU AS (
--- 통신사별 총UU 계산
select TELECOM
,SUM(N_FACTOR) UU
from sys.panel_data
group by TELECOM
)
select avg(UU)
from weekly_UU;
Q. 각 N_FACTOR 값이, TELECOM별 N_FACTOR에서 차지하는 비율 계산. (단, 비율은 반올림하여 소수점 첫째 자리까지만 출력. N_FACTOR이 높은 것부터 출력.)
-- weekly_UU 테이블: 통신사별 N_FACTOR의 총합
WITH weekly_UU AS (
select TELECOM
,SUM(N_FACTOR) UU
from sys.panel_data
group by TELECOM
)
select sys.panel_data.TELECOM
,sys.panel_data.N_FACTOR
,round(sys.panel_data.N_FACTOR / wu.UU *100,1) as pct
from sys.panel_data
inner join weekly_UU wu on sys.panel_data.TELECOM = wu.TELECOM -- 통신사를 기준으로 조인
order by sys.panel_data.N_FACTOR desc;
Result
TELECOM | N_FACTOR | pct |
---|---|---|
LG | 28778.94113 | 4.9 |
SK | 26133.46135 | 2.0 |