💯 Coding Test

[LeetCode] Reformat Department Table

date
Jul 23, 2023
slug
leetcode1179
author
status
Public
tags
SQL
summary
CASE문, IF문, Pivot(오라클)
type
Post
thumbnail
updatedAt
Jul 23, 2023 07:26 AM
category
💯 Coding Test

[문제 링크]

[풀이 코드]

+------+---------+-------+ | id | revenue | month | +------+---------+-------+ | 1 | 8000 | Jan | | 2 | 9000 | Jan | | 3 | 10000 | Feb | | 1 | 7000 | Feb | | 1 | 6000 | Mar | +------+---------+-------+
이 테이블 이렇게 서식을 다시 지정하려고 한다.
  • 4월부터 12월까지의 수익은 null입니다.
  • 결과 테이블에는 13개 열(부서 ID에 1개 + 월에 12개)이 있습니다.
+------+-------------+-------------+-------------+-----+-------------+ | 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. CASE문 - 3764ms 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
# 2. IF문 - 1703ms SELECT id, SUM(IF(month = 'Jan', revenue, null)) AS Jan_Revenue, SUM(IF(month = 'Feb', revenue, null)) AS Feb_Revenue, SUM(IF(month = 'Mar', revenue, null)) AS Mar_Revenue, SUM(IF(month = 'Apr', revenue, null)) AS Apr_Revenue, SUM(IF(month = 'May', revenue, null)) AS May_Revenue, SUM(IF(month = 'Jun', revenue, null)) AS Jun_Revenue, SUM(IF(month = 'Jul', revenue, null)) AS Jul_Revenue, SUM(IF(month = 'Aug', revenue, null)) AS Aug_Revenue, SUM(IF(month = 'Sep', revenue, null)) AS Sep_Revenue, SUM(IF(month = 'Oct', revenue, null)) AS Oct_Revenue, SUM(IF(month = 'Nov', revenue, null)) AS Nov_Revenue, SUM(IF(month = 'Dec', revenue, null)) AS Dec_Revenue FROM Department GROUP BY id
같은 IF문
같은 IF문
같은 IF문
같은 IF문
Runtime을 못 믿게 됐다……
같은 코드 반복 실행하면
IF문 처음에는 1703ms 나왔다가 958ms이 나오고 그런다..
ms이라 차이는 크게 안 나지만 순위 차이가 크다.
Leet Code에서 실행할 때, 순위에 대해서 크게 신경 쓰지 않아도 될 것 같다.
 
간단하게 하는 방법을 Solutions에서 찾았다.
나는 항상 MySQL로 실행했는데 Oracle에 이런 기능이 있었다.
# 3. Oracle Pivot - 973ms SELECT * FROM department PIVOT (SUM (revenue) Revenue FOR month IN ('Jan' Jan, 'Feb' Feb, 'Mar' Mar, 'Apr' Apr, 'May' May, 'Jun' Jun, 'Jul' Jul, 'Aug' Aug, 'Sep' Sep, 'Oct' Oct, 'Nov' Nov, 'Dec' Dec));
저기 Revenue부분이 Jan_Revenue이렇게 컬럼에 같이 출력된다.
오….좋다….