MSSQL - PIVOT 문의 드려봅니다. 0 2 2,812

by 한번사는인생 [SQLServer] [2020.06.04 15:31:07]



그림과 같이 연/월 그리고 count / view_count 컬럼이 있습니다.

제가 원하는 것은

행은 year / 열은 month 으로 나타내고 싶습니다.

 

pivot을 사용해서 year 기준으로 돌리는 것은 가능한데,

count / view_count를 함께 보여줄 방법이 도저히 생각이 안납니다.

 

pivot을 사용할때, 집계함수를 무조건 사용하는데.

해당 컬럼이 문자열일때에는 pivot이 불가능한가요?

 

서두없이 질문 드린점 죄송합니다(__)

by 마농 [2020.06.04 19:28:19]

원본은 있는데 결과표가 없네요?


by 마농 [2020.06.05 08:09:11]

Oracle 에서는 두개 항목에 대한 집계 피벗이 가능한데
 PIVOT (MIN(cnt) cnt, MIN(view_cnt) v_cnt FOR month IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12))
MSSQL 에서는 불가능 한 듯 합니다.
다른 대안으로는
1. 하나의 항목으로 묶어서 피벗
2. 두개 항목을 두줄로 표현. Unpivot
3. Pivot 구문 대신 Group By Min(Case ) 구문 사용
기타 사항 : year, month 등의 예약어를 컬럼명으로 사용하는 것은 지양해야 합니다.

-- Oracle
SELECT *
  FROM t
 PIVOT (MIN(cnt) cnt, MIN(view_cnt) v_cnt FOR month IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12))
;
-- MSSQL --
-- 1. 하나의 항목으로 묶어서 피벗
SELECT *
  FROM (SELECT year
             , month
             , CONCAT(cnt, '/', view_cnt) v
          FROM t
        ) a
 PIVOT (MIN(v) FOR month IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])) a
;
-- 2. 두개 항목을 두줄로 표현. Unpivot
SELECT *
  FROM t
 UNPIVOT (v FOR gb IN (cnt, view_cnt)) a
   PIVOT (MIN(v) FOR month IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])) a
 ORDER BY year, gb
;
-- 3. Pivot 구문 대신 Group By Min(Case ) 구문 사용
SELECT year
     , MIN(CASE month WHEN  1 THEN      cnt END)      cnt_01
     , MIN(CASE month WHEN  1 THEN view_cnt END) view_cnt_01
     , MIN(CASE month WHEN  2 THEN      cnt END)      cnt_02
     , MIN(CASE month WHEN  2 THEN view_cnt END) view_cnt_02
     , MIN(CASE month WHEN  3 THEN      cnt END)      cnt_03
     , MIN(CASE month WHEN  3 THEN view_cnt END) view_cnt_03
     , MIN(CASE month WHEN  4 THEN      cnt END)      cnt_04
     , MIN(CASE month WHEN  4 THEN view_cnt END) view_cnt_04
     , MIN(CASE month WHEN  5 THEN      cnt END)      cnt_05
     , MIN(CASE month WHEN  5 THEN view_cnt END) view_cnt_05
     , MIN(CASE month WHEN  6 THEN      cnt END)      cnt_06
     , MIN(CASE month WHEN  6 THEN view_cnt END) view_cnt_06
     , MIN(CASE month WHEN  7 THEN      cnt END)      cnt_07
     , MIN(CASE month WHEN  7 THEN view_cnt END) view_cnt_07
     , MIN(CASE month WHEN  8 THEN      cnt END)      cnt_08
     , MIN(CASE month WHEN  8 THEN view_cnt END) view_cnt_08
     , MIN(CASE month WHEN  9 THEN      cnt END)      cnt_09
     , MIN(CASE month WHEN  9 THEN view_cnt END) view_cnt_09
     , MIN(CASE month WHEN 10 THEN      cnt END)      cnt_10
     , MIN(CASE month WHEN 10 THEN view_cnt END) view_cnt_10
     , MIN(CASE month WHEN 11 THEN      cnt END)      cnt_11
     , MIN(CASE month WHEN 11 THEN view_cnt END) view_cnt_11
     , MIN(CASE month WHEN 12 THEN      cnt END)      cnt_12
     , MIN(CASE month WHEN 12 THEN view_cnt END) view_cnt_12
  FROM t
 GROUP BY year
;

 

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