본문 바로가기
SQL/코딩테스트

[MySQL] 그룹변수가 2개로 피벗테이블 구성

by Nanki 2024. 11. 5.

문제 : 아래와 같은 데이터가 있을 때 ID와, Month를 그룹으로하여 revenue의 합계를 구하는 피벗테이블을 구성해라. 이때 Month값이 열로 와야하며, 변수명은 다음과 같아야 한다.

변수명 : Jan_Revenue | Feb_Revenue | Mar_Revenue | ... | Dec_Revenue
/* INPUT TABLE
| id | revenue | month |
| -- | ------- | ----- |
| 1  | 8000    | Jan   |
| 2  | 9000    | Jan   |
| 3  | 10000   | Feb   |
| 1  | 7000    | Feb   |
| 1  | 6000    | Mar   |
*/
/* OUTPUT TABLE */
+------+-------------+-------------+-------------+-----+-------------+
| id   | Jan_Revenue | Feb_Revenue | Mar_Revenue | ... | Dec_Revenue |
+------+-------------+-------------+-------------+-----+-------------+
| 1    | 8000        | 7000        | 6000        | ... | null        |
| 2    | 9000        | null        | null        | ... | null        |
| 3    | null        | 10000       | null        | ... | null        |
+------+-------------+-------------+-------------+-----+-------------+

 

 

풀이방법 :

1. 열기준 변수 지정 :

Month를 조건을 걸어 새로운 변수를 생성해야 한다.

/ CASE WHEN 열기준 변수의 조건문 THEN  조건에 대한 결과 ELSE NULL END AS 새로운 열이름

 

2. 그 외 그룹 변수 지정 :
GROUP BY 문에 ID가 들어가 ID 별 피벗테이블을 구성해야 한다.

 

코드 :

SELECT id
    , SUM(CASE WHEN month="Jan" THEN revenue ELSE NULL END) AS Jan_Revenue
    , SUM(CASE WHEN month="Feb" THEN revenue ELSE NULL END) AS Feb_Revenue
    , SUM(CASE WHEN month="Mar" THEN revenue ELSE NULL END) AS Mar_Revenue
    , SUM(CASE WHEN month="Apr" THEN revenue ELSE NULL END) AS Apr_Revenue
    , SUM(CASE WHEN month="May" THEN revenue ELSE NULL END) AS May_Revenue
    , SUM(CASE WHEN month="Jun" THEN revenue ELSE NULL END) AS Jun_Revenue
    , SUM(CASE WHEN month="Jul" THEN revenue ELSE NULL END) AS Jul_Revenue
    , SUM(CASE WHEN month="Aug" THEN revenue ELSE NULL END) AS Aug_Revenue
    , SUM(CASE WHEN month="Sep" THEN revenue ELSE NULL END) AS Sep_Revenue
    , SUM(CASE WHEN month="Oct" THEN revenue ELSE NULL END) AS Oct_Revenue
    , SUM(CASE WHEN month="Nov" THEN revenue ELSE NULL END) AS Nov_Revenue
    , SUM(CASE WHEN month="Dec" THEN revenue ELSE NULL END) AS Dec_Revenue
FROM Department
GROUP BY id

 

왜 ELSE 뒤에 NULL을 쓰는가? 아래 글 참고

https://rhie.tistory.com/27