안녕하세요. 쿼리좀 질문드립니다.
주소 | 성별 | 나이대 | 사람수 |
팔달구 10-1 | 남자 | 10대 | 30 |
팔달구 10-1 | 남자 | 30대 | 30 |
팔달구 10-1 | 여자 | 30대 | 20 |
팔달구 20-1 | 남자 | 10대이하 | 100 |
팔달구 20-1 | 여자 | 10대이하 | 120 |
팔달구 20-1 | 남자 | 60대 | 300 |
팔달구 20-1 | 남자 | 50대 | 150 |
팔달구 30-1 | 남자 | 40대 | 80 |
팔달구 30-1 | 여자 | 30대 | 60 |
......
이런식의 데이터가 있는데요.
주소에 남여 구분이 있고
나이대가 10세이하, 10대, 20대, 30대, 40대, 50대, 61이상 7개의 구분으로 되어있습니다.
주소, 남여구분, 나이대에 해당하는 사람수가 컬럼으로 들어가 있구요.
이런 데이터를 다음과같이 표현하고자 합니다. (한개의 주소에 대한 사람수를 성별+나이대로 구분하려 합니다.)
주소 | 10세이하남 | 10대남 | 20대남 | 30대남 | 40대남 | 50대남 | 61세이상남 | 10세이하여 | 10대여 | 20대여 | 30대여 | 40대여 | 50대여 | 61세이상여 |
팔달구 10-1 | 0 | 0 | 100 | 20 | 30 | 10 | 0 | 0 | 20 | 20 | 0 | 100 | 30 | 200 |
팔달구 30-1 | 10 | 20 | 30 | 0 | 0 | 40 | 60 | 10 | 10 | 10 | 10 | 20 | 0 | 100 |
...........
예시를 위하여 임의 값을 넣은것이고요.. 이런식으로 표현하고자하는데
위 형식의 데이터에서 쿼리를 어떤식으로 해야 효율적일까요?
건수가 500만건 정도입니다.
WITH T ( ADDR , GENDER , YEARS , MANS ) AS ( SELECT '팔달구 10-1','남자','10대', 30 FROM DUAL UNION ALL SELECT '팔달구 10-1','남자','30대', 30 FROM DUAL UNION ALL SELECT '팔달구 10-1','여자','30대', 20 FROM DUAL UNION ALL SELECT '팔달구 20-1','남자','10대이하', 100 FROM DUAL UNION ALL SELECT '팔달구 20-1','여자','10대이하', 120 FROM DUAL UNION ALL SELECT '팔달구 20-1','남자','60대', 300 FROM DUAL UNION ALL SELECT '팔달구 20-1','남자','50대', 150 FROM DUAL UNION ALL SELECT '팔달구 30-1','남자','40대', 80 FROM DUAL UNION ALL SELECT '팔달구 30-1','여자','30대', 60 FROM DUAL ) SELECT ADDR , SUM(CASE WHEN YEARS = '10대이하' AND GENDER = '남자' THEN MANS END) AS "10세이하남" , SUM(CASE WHEN YEARS = '10대' AND GENDER = '남자' THEN MANS END) AS "10세남" , SUM(CASE WHEN YEARS = '20대' AND GENDER = '남자' THEN MANS END) AS "20세남" , SUM(CASE WHEN YEARS = '30대' AND GENDER = '남자' THEN MANS END) AS "30세남" , SUM(CASE WHEN YEARS = '40대' AND GENDER = '남자' THEN MANS END) AS "40세남" , SUM(CASE WHEN YEARS = '50대' AND GENDER = '남자' THEN MANS END) AS "50세남" , SUM(CASE WHEN YEARS = '61대이상' AND GENDER = '남자' THEN MANS END) AS "61세이상남" , SUM(CASE WHEN YEARS = '10대이하' AND GENDER = '여자' THEN MANS END) AS "10세이하여" , SUM(CASE WHEN YEARS = '10대' AND GENDER = '여자' THEN MANS END) AS "10세여" , SUM(CASE WHEN YEARS = '20대' AND GENDER = '여자' THEN MANS END) AS "20세여" , SUM(CASE WHEN YEARS = '30대' AND GENDER = '여자' THEN MANS END) AS "30세여" , SUM(CASE WHEN YEARS = '40대' AND GENDER = '여자' THEN MANS END) AS "40세여" , SUM(CASE WHEN YEARS = '50대' AND GENDER = '여자' THEN MANS END) AS "50세여" , SUM(CASE WHEN YEARS = '61대이상' AND GENDER = '여자' THEN MANS END) AS "61세이상여" FROM T GROUP BY ADDR
-- PIVOT WITH T ( ADDR , GENDER , YEARS , MANS ) AS ( SELECT '팔달구 10-1','남자','10대', 30 FROM DUAL UNION ALL SELECT '팔달구 10-1','남자','30대', 30 FROM DUAL UNION ALL SELECT '팔달구 10-1','여자','30대', 20 FROM DUAL UNION ALL SELECT '팔달구 20-1','남자','10대이하', 100 FROM DUAL UNION ALL SELECT '팔달구 20-1','여자','10대이하', 120 FROM DUAL UNION ALL SELECT '팔달구 20-1','남자','60대', 300 FROM DUAL UNION ALL SELECT '팔달구 20-1','남자','50대', 150 FROM DUAL UNION ALL SELECT '팔달구 30-1','남자','40대', 80 FROM DUAL UNION ALL SELECT '팔달구 30-1','여자','30대', 60 FROM DUAL ) SELECT * FROM (SELECT ADDR , GENDER || YEARS GB , MANS FROM T ) A PIVOT ( MAX(MANS) FOR GB IN ( '남자10대이하' , '남자10대' , '남자20대' , '남자30대' , '남자40대' , '남자50대' , '남자61세이상' ,'여자10대이하' , '여자10대' , '여자20대' , '여자30대' , '여자40대' , '여자50대' , '여자61세이상' ) )