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을 써서 하는걸로 작성하고 있는데 초보로 어려움이 많네요...ㅜㅜ
고수님들의 많은 답변 부탁드려요....
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
;
마농님 감사합니다.
궁금한게 하나 더 있어서 그러는데요.
질문글에는 제가 한국하고 일본만 넣었는데요. 그게 가변적으로 많이 있을수도 있고 하나일수도 있거든요.
그런 경우에는 어떻게 해야 할까요??
rownum결과가 다를수 있다는 것을 질문에 넣지 못한 점 죄송합니다.
필요한 만큼 MIN(CASE) 3개씩 한 세트로 추가하시면 됩니다.
열을 가변으로 보여줄 수는 없습니다.
최대 가능수만큼 고정으로 만들어 놓던가.
아니면 동적 쿼리를 이용해야 합니다.
그렇군요.....이것만이라도 엄청 도움이 되었습니다.
감사합니다.