csv 데이터를 직접 DBeaver에 업로드하여 실습을 진행했다. 처음에 데이터를 불러오기까지 정말 많은 시행착오(DBeaver와 csv 데이터 연결 및 csv 한글 인코딩 깨짐 현상 등)가 있었지만, 나의 멋진 구글링 실력으로 해결했다. 아래의 패널 데이터를 통해 요리조리 내가 원하는 데이터를 뽑아내보는 것이 오늘의 목표이다.

내가 오늘 사용할 패널 데이터의 칼럼은 아래와 같다

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


집계하기 GROUP BY

Q. 연령별 N_FACTOR를 집계하기. N_FACTOR는 반올림하여 소수점 첫째 자리까지만 출력. 단, 내림차순으로 정렬할 것.

select AGE, ROUND(SUM(N_FACTOR),1)
from sys.panel_data
group by AGE
order by AGE DESC;

Result: 연령별로 집계가 되고, UU가 높은 순으로 내림차순이 됐다. Good.

AGE AGE_UU
60~69 881608.7
55~59 529625.7
50~54 378835.0
40~44 335594.5
45~49 248445.1
70~79 176531.7
35~39 115049.5
25~29 53935.4
13~18 29093.4
19~24 27781.8
30~34 26434.0


Q. 아래 형식에 맞춰 연령별, TELECOM별 N_FACTOR를 집계하기. 연령은 낮은순부터 정렬.

AGE SKT KT LG etc
13~18        
19~24        
25~29        
30~34        
35~39        
40~44        
45~49        
50~54        
55~59        
60~69        
70~79        
select AGE
     , SUM(case when TELECOM = 'SK' then N_FACTOR end) as SK
     , SUM(case when TELECOM = 'KT' then N_FACTOR end) as KT
     , SUM(case when TELECOM = 'LG' then N_FACTOR end) as LG
     , SUM(case when TELECOM = 'etc' then N_FACTOR end) as etc
from sys.panel_data
group by AGE  
order by AGE ASC;

Result: 여기서 값이 없는 값은 [NULL] 처리가 된다.

AGE SKT KT LG etc
13~18 29093.4      
19~24 3571.0 20201.7 4009.0  
25~29 9280.4 1140.3 14125.8 29388.9
30~34 11987.5 6403.7 8042.8  
35~39 41234.9 40628.7 31631.9 1554.1
40~44 162834.1 76541.1 90240.5 5978.8
45~49 123704.7 65945.7 39085.4 19709.3
50~54 192130.0 104712.3 72708.1 9284.7
55~59 284285.6 126631.3 115988.1 2720.7
60~69 392556.4 305931.6 155420.2 27700.5
70~79 75463.2 41695.9 54338.1 5034.6

Tip: 여기서 Pivoting을 해야하는 칼럼의 개수가 많게되면, SQL 쿼리문을 쓰다가 날이 샐 수도 있으니 데이터의 크기가 그렇게 크지 않다면 Google Spread Sheet로 Pivot 테이블을 만드는 것도 방법임.


Q. N_FACTOR가 가장 높은 값과 가장 낮을 값을 추출.

select MAX(N_FACTOR) as MAX_VALUE
	  ,MIN(N_FACTOR) as MIN_VALUE
from sys.panel_data;
MAX_VALUE MIN_VALUE
28778.94113 33.13769