postgresql pivot 질문드립니다. 0 5 7,847

by 엉재 [DB 기타] postgresql pivot crosstab [2019.01.17 22:50:20]


postgresql에서 세로를 가로로 표현하고 하는데요.

 

데이터는 아래와 같습니다.

일자 구분 국가 가입건수 탈퇴건수
20181231 일본 12 3
20181231 한국 23 10

postgresql의 crosstab을 써서 pivot을 할 때 아래와 같이 데이터를 추출하고자 합니다.

일자 국가 가입건수 탈퇴건수 국가 가입건수 탈퇴건수
20181231 일본 12 3 한국 23 10

 

Select *
  from (
Select '웹' AS divi, '일본' AS resion_cd, '20181231' AS work_date, '12' AS join_cnt, '3' AS disjoin_cnt  UNION ALL
Select '웹' AS divi, '한국' AS resion_cd, '20181231' AS work_date, '23' AS join_cnt, '10' AS disjoin_cnt );

 

crosstab을 써서 하는걸로 작성하고 있는데 초보로 어려움이 많네요...ㅜㅜ

 

고수님들의 많은 답변 부탁드려요....

by 마농 [2019.01.18 08:51:42]
WITH t AS
(
SELECT '웹' divi, '일본' resion_cd, '20181231' work_date, 12 join_cnt, 3 disjoin_cnt
UNION ALL SELECT '웹', '한국', '20181231', 23, 10
)
SELECT divi, work_date
     , MIN(CASE rn WHEN 1 THEN resion_cd   END)   resion_cd_1
     , MIN(CASE rn WHEN 1 THEN join_cnt    END)    join_cnt_1
     , MIN(CASE rn WHEN 1 THEN disjoin_cnt END) disjoin_cnt_1
     , MIN(CASE rn WHEN 2 THEN resion_cd   END)   resion_cd_2
     , MIN(CASE rn WHEN 2 THEN join_cnt    END)    join_cnt_2
     , MIN(CASE rn WHEN 2 THEN disjoin_cnt END) disjoin_cnt_2
  FROM (SELECT divi, work_date
             , resion_cd, join_cnt, disjoin_cnt
             , ROW_NUMBER() OVER(PARTITION BY divi, work_date ORDER BY 1) rn
          FROM t
        ) a
 GROUP BY divi, work_date
;

 


by 엉재 [2019.01.18 09:05:20]

마농님 감사합니다.

궁금한게 하나 더 있어서 그러는데요.

질문글에는 제가 한국하고 일본만 넣었는데요. 그게 가변적으로 많이 있을수도 있고 하나일수도 있거든요.

그런 경우에는 어떻게 해야 할까요??

rownum결과가 다를수 있다는 것을 질문에 넣지 못한 점 죄송합니다.


by 마농 [2019.01.18 09:08:26]

필요한 만큼 MIN(CASE) 3개씩 한 세트로 추가하시면 됩니다.
열을 가변으로 보여줄 수는 없습니다.
최대 가능수만큼 고정으로 만들어 놓던가.
아니면 동적 쿼리를 이용해야 합니다.


by 엉재 [2019.01.18 16:01:48]

그렇군요.....이것만이라도 엄청 도움이 되었습니다.

감사합니다.

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