PostgreSQL pivot(crosstab) 하는 방법이 궁금합니다.. 0 6 2,607

by 크크크크크 [SQL Query] PostgreSQL pivot crosstab [2023.08.17 16:17:11]


WITH data AS
(
SELECT 'min' "name", '20230702' "year", 1 "count"
UNION ALL SELECT 'su', '20230702', 3
UNION ALL SELECT 'su', '20230705', 1
UNION ALL SELECT 'su', '20230714', 2
UNION ALL SELECT 'su', '20230726', 7
UNION ALL SELECT 'min', '20230726', 11
UNION ALL SELECT 'min', '20230827', 26
)
SELECT * FROM data

 

 

이름은 그대로 나오고 year 날짜가 컬럼으로 가고 그 값은 count로 나타내고 싶습니다..

부탁드립니다.. ㅠㅠ

도무지 어떻게 해야될지 모르겠어요 흑흑...

by 마농 [2023.08.18 08:37:19]

원하는 결과를 표로 그려주세요.
data, name, year, count 등의 예약어를 명칭으로 사용하는 것은 좋지 않습니다.


by 화니 [2023.08.18 09:31:46]
이름 2023-07-29 2023-07-30 2023-07-31 2023-08-01
min 4 9 2 2
su 2 0 1 5

 

안녕하세요.

답변 너무 너무 감사합니다 ㅎㅎ

(영광입니다 꾸벅!)

결과물은 위와 같습니다~!

날짜 범위(2023-07-29 ~ 2023-08-01)를 조회를 하면 선택 한 날짜가 컬럼이 되고,

cnt가 값이 되는 걸 구현하고 싶습니다..ㅠㅠ


by 마농 [2023.08.18 10:13:40]
WITH t_data AS
(
SELECT 'min' nm, '20230729' dt, 1 cnt
UNION ALL SELECT 'su' , '20230730',  3
UNION ALL SELECT 'su' , '20230731',  1
UNION ALL SELECT 'su' , '20230801',  2
UNION ALL SELECT 'su' , '20230729',  7
UNION ALL SELECT 'min', '20230730', 11
UNION ALL SELECT 'min', '20230801', 26
)
SELECT nm
     , SUM(CASE dt WHEN '20230729' THEN cnt END) "20230729"
     , SUM(CASE dt WHEN '20230730' THEN cnt END) "20230730"
     , SUM(CASE dt WHEN '20230731' THEN cnt END) "20230731"
     , SUM(CASE dt WHEN '20230801' THEN cnt END) "20230801"
  FROM t_data
 WHERE dt >= '20230729'
   AND dt <= '20230801'
 GROUP BY nm
;

컬럼값들을 다 알고 있어야 가능합니다.
기간이 변함에 따라 컬럼의 값도 달라지고 개수도 달라진다면?
쿼리만으로는 자동으로 구현되지 않습니다.
동적쿼리를 이용해야 합니다.


by 화니 [2023.08.18 12:11:32]

답변 너무나도 감사합니다~!
작성해 주신 쿼리로 동적으로 만들어서 완성해 보겠습니다 ㅎㅎ
많이 배우고 있습니다 감사합니다~~~


by 마농 [2023.08.18 08:43:43]
WITH t_data AS
(
SELECT 'min' nm, '20230702' dt, 1 cnt
UNION ALL SELECT 'su' , '20230702',  3
UNION ALL SELECT 'su' , '20230705',  1
UNION ALL SELECT 'su' , '20230714',  2
UNION ALL SELECT 'su' , '20230726',  7
UNION ALL SELECT 'min', '20230726', 11
UNION ALL SELECT 'min', '20230827', 26
)
SELECT nm
     , SUM(CASE dd WHEN '01' THEN cnt END) m01
     , SUM(CASE dd WHEN '02' THEN cnt END) m02
     , SUM(CASE dd WHEN '03' THEN cnt END) m03
     , SUM(CASE dd WHEN '04' THEN cnt END) m04
     , SUM(CASE dd WHEN '05' THEN cnt END) m05
     , SUM(CASE dd WHEN '06' THEN cnt END) m06
     , SUM(CASE dd WHEN '07' THEN cnt END) m07
     , SUM(CASE dd WHEN '08' THEN cnt END) m08
     , SUM(CASE dd WHEN '09' THEN cnt END) m09
     , SUM(CASE dd WHEN '10' THEN cnt END) m10
     , SUM(CASE dd WHEN '11' THEN cnt END) m11
     , SUM(CASE dd WHEN '12' THEN cnt END) m12
     , SUM(CASE dd WHEN '13' THEN cnt END) m13
     , SUM(CASE dd WHEN '14' THEN cnt END) m14
     , SUM(CASE dd WHEN '15' THEN cnt END) m15
     , SUM(CASE dd WHEN '16' THEN cnt END) m16
     , SUM(CASE dd WHEN '17' THEN cnt END) m17
     , SUM(CASE dd WHEN '18' THEN cnt END) m18
     , SUM(CASE dd WHEN '19' THEN cnt END) m19
     , SUM(CASE dd WHEN '20' THEN cnt END) m20
     , SUM(CASE dd WHEN '21' THEN cnt END) m21
     , SUM(CASE dd WHEN '22' THEN cnt END) m22
     , SUM(CASE dd WHEN '23' THEN cnt END) m23
     , SUM(CASE dd WHEN '24' THEN cnt END) m24
     , SUM(CASE dd WHEN '25' THEN cnt END) m25
     , SUM(CASE dd WHEN '26' THEN cnt END) m26
     , SUM(CASE dd WHEN '27' THEN cnt END) m27
     , SUM(CASE dd WHEN '28' THEN cnt END) m28
     , SUM(CASE dd WHEN '29' THEN cnt END) m29
     , SUM(CASE dd WHEN '30' THEN cnt END) m30
     , SUM(CASE dd WHEN '31' THEN cnt END) m31
  FROM (SELECT nm
             , SUBSTR(dt, 7, 2) dd
             , cnt
          FROM t_data
         WHERE dt LIKE '202307%'
        ) a
 GROUP BY nm
;

 


by 화니 [2023.08.18 09:32:57]

감사합니다 ㅠㅠ

 

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