리트코드에 있는 1179. Reformat Department Table를 푸는 데에 3시간을 썼다 ^^ 하.하.하.
새롭게 알게 된 내용이 있어 정리할 겸 쓰는 글
https://leetcode.com/problems/reformat-department-table/


정말.. 이 한 문제를 풀려고 얼마나 괴상한 코드를 써봤는지 모르겠음

저 괴상망측한 코드들.............
어찌저찌 여기까지는 만들었는데 코드를 어떻게 짜도 나타나는 공통적인 문제는,
GROUP BY를 하기만 하면
id = 1의 2월, 3월달 값이 계속 null로 나온다는 것....
이렇게^^
id = 1의 2월, 3월 값이 사라져버림
한 3시간을 씨름하다가 결국 못 참겠어서 강의를 봤는데
GROUP BY를 쓸 때는 집계 함수를 꼭 사용해야 한다는 것을 알게 되었다.
근데 왜인지 이해가 안가서 .. ^^ㅋㅋㅋㅋㅋㅋ
나름 정리해보았다
우리가 보기에 데이터들은 1개의 표 안에 착착 들어가있는 것처럼 보이지만,
사실 컴퓨터 입장에서는 무수히 많은 셀이 데이터를 1개씩 갖고 있는 것임
무슨 말이냐하면 각 id의 revenue는 컴퓨터 입장에서 아래와 같이 저장됨
| id | Jan | Feb | Mar | Apr | ... | Dec |
|---|---|---|---|---|---|---|
| 1 | 8000 | null | null | null | null | null |
| 1 | null | 7000 | null | null | null | null |
| 1 | null | null | 6000 | null | null | null |
| 2 | 9000 | null | null | null | null | null |
| 3 | null | 10000 | null | null | null | null |
이걸 사람이 보기 편하게 하나로 정리하면 아래와 같은 형태
| id | Jan | Feb | Mar | Apr | ... | Dec |
|---|---|---|---|---|---|---|
| 1 | 8000 | 7000 | 6000 | null | null | null |
| 2 | 9000 | null | null | null | null | null |
| 3 | null | 10000 | null | null | null | null |
결론적으로, 왜 SUM함수를 써야하는지 정리해보자면
SELECT id,
CASE WHEN month = 'Jan' THEN revenue ELSE NULL END AS 'Jan_Revenue',
CASE WHEN month = 'Feb' THEN revenue ELSE NULL END AS 'Feb_Revenue',
CASE WHEN month = 'Mar' THEN revenue ELSE NULL END AS 'Mar_Revenue'
FROM Department
GROUP BY id
SUM 함수 없이 위와 같이 쓰게 될 경우, id가 1인 경우가 3개 있는데
id = 1, Jan_Revenue => (8000, null, null)이 그룹화 되면서 8000이 보이고
id = 1, Feb_Revenue => (null, 7000, null)이 그룹화 되면서 맨 앞에 null만 화면에 보이게 됨
id = 1, Mar_Revenue => (null, null, 10000)이 그룹화 되면서 맨 앞에 null만 화면에 보이게 됨
따라서!!!! 값이 2개 이상일 경우 집계함수를 통해 '실제 존재하는 값'이 나오도록 조정해주는 것이 필요
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'
FROM Department
GROUP BY id
| id | Jan_Revenue | Feb_Revenue | Mar_Revenue |
|---|---|---|---|
| 1 | 8000 | 7000 | 6000 |
| 2 | 9000 | null | null |
| 3 | null | 10000 | null |
이렇게 하면 id = 1의 2월, 3월 revenue가 잘 나온다.
내 입장에서는 SUM(CASE WHEN month = 'Jan'~)을 할 경우
(8000 + 9000)이 된다고 생각했지만
GROUP BY id를 해줬기 때문에 id별 그루핑이 되었으니 상관 없음..
조금 더 연습을 해보자
만약 월별 총 매출을 구하고 싶다면?
SELECT month, SUM(revenue)
FROM Department
GROUP BY month
| month | SUM(revenue) |
|---|---|
| Jan | 17000 |
| Feb | 17000 |
| Mar | 6000 |
만약 id 별 총 매출을 구하고 싶다면?
SELECT id, SUM(revenue)
FROM Department
GROUP BY id
| id | SUM(revenue) |
|---|---|
| 1 | 21000 |
| 2 | 9000 |
| 3 | 10000 |
결론
GROUP BY를 할 때는 꼭 집계 함수를 써준다.
어떤 함수를 쓰는지는 쿼리 조건에 따라 다름.