[mySQL] GROUP BY에 집계함수를 써야 하는 이유

sehyunny·2023년 4월 12일
0

mySQL

목록 보기
1/26

리트코드에 있는 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는 컴퓨터 입장에서 아래와 같이 저장됨

idJanFebMarApr...Dec
18000nullnullnullnullnull
1null7000nullnullnullnull
1nullnull6000nullnullnull
29000nullnullnullnullnull
3null10000nullnullnullnull

이걸 사람이 보기 편하게 하나로 정리하면 아래와 같은 형태

idJanFebMarApr...Dec
1800070006000nullnullnull
29000nullnullnullnullnull
3null10000nullnullnullnull

결론적으로, 왜 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
idJan_RevenueFeb_RevenueMar_Revenue
1800070006000
29000nullnull
3null10000null

이렇게 하면 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
monthSUM(revenue)
Jan17000
Feb17000
Mar6000

만약 id 별 총 매출을 구하고 싶다면?

SELECT id, SUM(revenue)
FROM Department
GROUP BY id
idSUM(revenue)
121000
29000
310000

결론
GROUP BY를 할 때는 꼭 집계 함수를 써준다.
어떤 함수를 쓰는지는 쿼리 조건에 따라 다름.

0개의 댓글