문제
Table: Department
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| revenue | int |
| month | varchar |
+-------------+---------+
(id, month) is the primary key of this table.
The table has information about the revenue of each department per month.
The month has values in ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"].
Plain Text
복사
Write an SQL query to reformat the table such that there is a department id column and a revenue column for each month.
Return the result table in any order.
예시
Input:
Department table:
+------+---------+-------+
| id | revenue | month |
+------+---------+-------+
| 1 | 8000 | Jan |
| 2 | 9000 | Jan |
| 3 | 10000 | Feb |
| 1 | 7000 | Feb |
| 1 | 6000 | Mar |
+------+---------+-------+
Output:
+------+-------------+-------------+-------------+-----+-------------+
| id | Jan_Revenue | Feb_Revenue | Mar_Revenue | ... | Dec_Revenue |
+------+-------------+-------------+-------------+-----+-------------+
| 1 | 8000 | 7000 | 6000 | ... | null |
| 2 | 9000 | null | null | ... | null |
| 3 | null | 10000 | null | ... | null |
+------+-------------+-------------+-------------+-----+-------------+
Explanation: The revenue from Apr to Dec is null.
Note that the result table has 13 columns (1 for the department id + 12 for the months).
Plain Text
복사
정답
SELECT MAX(id) id,
MAX(CASE month WHEN 'Jan' THEN revenue END) Jan_Revenue,
MAX(CASE month WHEN 'Feb' THEN revenue END) Feb_Revenue,
MAX(CASE month WHEN 'Mar' THEN revenue END) Mar_Revenue,
MAX(CASE month WHEN 'Apr' THEN revenue END) Apr_Revenue,
MAX(CASE month WHEN 'May' THEN revenue END) May_Revenue,
MAX(CASE month WHEN 'Jun' THEN revenue END) Jun_Revenue,
MAX(CASE month WHEN 'Jul' THEN revenue END) Jul_Revenue,
MAX(CASE month WHEN 'Aug' THEN revenue END) Aug_Revenue,
MAX(CASE month WHEN 'Sep' THEN revenue END) Sep_Revenue,
MAX(CASE month WHEN 'Oct' THEN revenue END) Oct_Revenue,
MAX(CASE month WHEN 'Nov' THEN revenue END) Nov_Revenue,
MAX(CASE month WHEN 'Dec' THEN revenue END) Dec_Revenue
FROM Department
GROUP BY id
;
SQL
복사
풀이
•
CASE WHEN을 사용해서 특정 컬럼의 값이 특정 값인 경우 다른 값을 출력하게 만들 수 있다.
•
예를 들어 위의 문제에서 id로 그룹핑을 하면 id 별로 month와 revenue가 담길 것이다. month 컬럼에 대해서 ‘Jan’을 가지고 있는 경우 revenue를 알고 싶으므로 다음을 사용한다.
(CASE month WHEN 'Jan' THEN revenue END)
SQL
복사
•
그리고 GROUP BY 를 사용했기 때문에 MAX로 출력을 해준다.
MAX(CASE month WHEN 'Jan' THEN revenue END)
SQL
복사