쿼리 질문 드립니다. 0 4 78

by 지에나르 [SQL Query] [2018.10.12 15:27:39]


안녕하세요. 쿼리좀 질문드립니다.

주소 성별 나이대 사람수
팔달구 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만건 정도입니다.

by 우리집아찌 [2018.10.12 15:34:23]

DBMS를 명시해주세요.


by 지에나르 [2018.10.12 15:38:39]

아 죄송합니다.

오라클 입니다!


by 우리집아찌 [2018.10.12 15:56:19]
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
 

 


by 우리집아찌 [2018.10.12 16:14:08]
-- 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세이상' )
       )
 

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입