S/W 전문가
소스팩토리
S/W 전문가
전체 방문자
오늘
어제
  • Developer Study
    • C#
      • 개념 정리
    • Java
      • Java Developer Note
    • Oracle
      • ORA 오류 모음
      • Oracle 문재 해결
      • Oracle Developer Note
    • Cassandra
      • Cassandra Developer Note
    • PostgreSQL
      • PostgreSQL Developer Note
    • Computer Utilization
      • Computer Setup Note

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ORA-00924
  • ORA-00910
  • ORA-00018
  • ORA-00001
  • ORA-00904
  • Oracle Session Parameter
  • ​C# Data Type
  • C# 데이터타입

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
S/W 전문가

소스팩토리

[PostqreSQL] PIVOT & UNPIVOT
PostgreSQL/PostgreSQL Developer Note

[PostqreSQL] PIVOT & UNPIVOT

2022. 10. 26. 11:00

PIVOT 샘플 테이블 

SELECT 1 AS CUSTOMER_ID, 100 AS Q1, 210 AS Q2, 203 AS Q3, 304 AS Q4 
UNION ALL
SELECT 2 AS CUSTOMER_ID, 150 AS Q1, 118 AS Q2, 423 AS Q3, 257 AS Q4 
UNION ALL
SELECT 3 AS CUSTOMER_ID, 220 AS Q1, 311 AS Q2, 351 AS Q3, 269 AS Q4 
UNION ALL
SELECT 4 AS CUSTOMER_ID, 330 AS Q1, 406 AS Q2, 652 AS Q3, 956 AS Q4

PIVOT

WITH RECURSIVE TEMP_PIVOT (CUSTOMER_ID, Q1, Q2, Q3, Q4)
AS
(
	SELECT 1 AS CUSTOMER_ID, 100 AS Q1, 210 AS Q2, 203 AS Q3, 304 AS Q4 UNION ALL
	SELECT 2 AS CUSTOMER_ID, 150 AS Q1, 118 AS Q2, 423 AS Q3, 257 AS Q4 UNION ALL
	SELECT 3 AS CUSTOMER_ID, 220 AS Q1, 311 AS Q2, 351 AS Q3, 269 AS Q4 UNION ALL
	SELECT 4 AS CUSTOMER_ID, 330 AS Q1, 406 AS Q2, 652 AS Q3, 956 AS Q4 
)
SELECT C.CUSTOMER_ID, T.*
  FROM TEMP_PIVOT C
 CROSS JOIN LATERAL (VALUES (C.Q1, 'Q1')
						   ,(C.Q2, 'Q2')
						   ,(C.Q3, 'Q3')
						   ,(C.Q4, 'Q4')
					) AS T(TURNOVER, QUARTER)
ORDER BY CUSTOMER_ID, QUARTER

PIVOT 결과

UNPIVOT 샘픔 테이블

SELECT 1 AS CUSTOMER_ID, 101 AS TURNOVER, 'Q1' AS QUARTER 
UNION ALL
SELECT 1 AS CUSTOMER_ID, 102 AS TURNOVER, 'Q2' AS QUARTER 
UNION ALL
SELECT 1 AS CUSTOMER_ID, 103 AS TURNOVER, 'Q3' AS QUARTER 
UNION ALL
SELECT 1 AS CUSTOMER_ID, 104 AS TURNOVER, 'Q4' AS QUARTER 
UNION ALL
SELECT 2 AS CUSTOMER_ID, 201 AS TURNOVER, 'Q1' AS QUARTER 
UNION ALL
SELECT 2 AS CUSTOMER_ID, 202 AS TURNOVER, 'Q2' AS QUARTER 
UNION ALL
SELECT 2 AS CUSTOMER_ID, 203 AS TURNOVER, 'Q3' AS QUARTER 
UNION ALL
SELECT 2 AS CUSTOMER_ID, 204 AS TURNOVER, 'Q4' AS QUARTER 
UNION ALL
SELECT 3 AS CUSTOMER_ID, 301 AS TURNOVER, 'Q1' AS QUARTER 
UNION ALL
SELECT 3 AS CUSTOMER_ID, 302 AS TURNOVER, 'Q2' AS QUARTER 
UNION ALL
SELECT 3 AS CUSTOMER_ID, 303 AS TURNOVER, 'Q3' AS QUARTER 
UNION ALL
SELECT 3 AS CUSTOMER_ID, 304 AS TURNOVER, 'Q4' AS QUARTER 
UNION ALL
SELECT 4 AS CUSTOMER_ID, 401 AS TURNOVER, 'Q1' AS QUARTER 
UNION ALL
SELECT 4 AS CUSTOMER_ID, 402 AS TURNOVER, 'Q2' AS QUARTER 
UNION ALL
SELECT 4 AS CUSTOMER_ID, 403 AS TURNOVER, 'Q3' AS QUARTER 
UNION ALL
SELECT 4 AS CUSTOMER_ID, 404 AS TURNOVER, 'Q4' AS QUARTER

UNPIVOT 샘플

UNPIVOT

WITH RECURSIVE TEMP_UNPIVOT (CUSTOMER_ID, TURNOVER, QUARTER)
AS
(
	WITH RECURSIVE TEMP_PIVOT (CUSTOMER_ID, Q1, Q2, Q3, Q4)
	AS
	(
		SELECT 1 AS CUSTOMER_ID, 100 AS Q1, 210 AS Q2, 203 AS Q3, 304 AS Q4 UNION ALL
		SELECT 2 AS CUSTOMER_ID, 150 AS Q1, 118 AS Q2, 423 AS Q3, 257 AS Q4 UNION ALL
		SELECT 3 AS CUSTOMER_ID, 220 AS Q1, 311 AS Q2, 351 AS Q3, 269 AS Q4 UNION ALL
		SELECT 4 AS CUSTOMER_ID, 330 AS Q1, 406 AS Q2, 652 AS Q3, 956 AS Q4 
	)
	SELECT C.CUSTOMER_ID, T.*
	  FROM TEMP_PIVOT C
	 CROSS JOIN LATERAL (VALUES (C.Q1, 'Q1')
							   ,(C.Q2, 'Q2')
							   ,(C.Q3, 'Q3')
							   ,(C.Q4, 'Q4')
						) AS T(TURNOVER, QUARTER)
	ORDER BY CUSTOMER_ID, QUARTER
)
	SELECT C.CUSTOMER_ID
	      ,MAX(CASE WHEN C.QUARTER = 'Q1' THEN C.TURNOVER END) AS Q1
	      ,MAX(CASE WHEN C.QUARTER = 'Q2' THEN C.TURNOVER END) AS Q2
	      ,MAX(CASE WHEN C.QUARTER = 'Q3' THEN C.TURNOVER END) AS Q3
	      ,MAX(CASE WHEN C.QUARTER = 'Q4' THEN C.TURNOVER END) AS Q4
	  FROM TEMP_UNPIVOT C
     GROUP BY C.CUSTOMER_ID

 

UNPIVOT 결과

저작자표시 비영리 변경금지 (새창열림)

'PostgreSQL > PostgreSQL Developer Note' 카테고리의 다른 글

PostgreSQL 다운로드 및 설치 방법 [Windows]  (0) 2022.04.21
    'PostgreSQL/PostgreSQL Developer Note' 카테고리의 다른 글
    • PostgreSQL 다운로드 및 설치 방법 [Windows]
    S/W 전문가
    S/W 전문가

    티스토리툴바