COUNT와 SUM의 집계 방식에 있어 차이가 있음에도
개념이 확실히 잡히지 않은 것 같아 한참을 헤맸다.
정리하기 위해 쓰는 글!
https://solvesql.com/problems/bike-rent-stats/
동일한 문제에 대해서 각각 COUNT와 SUM을 사용하였을 때 나오는 코드는 아래와 같다.
* COUNT 사용 시
SELECT s1.local
,COUNT(*) AS all_rent
,COUNT(CASE WHEN s1.local = s2.local THEN 1 ELSE NULL END) AS same_local
,COUNT(CASE WHEN s1.local <> s2.local THEN 1 ELSE NULL END) AS diff_local
FROM station AS s1
LEFT JOIN rental_history ON s1.station_id = rental_history.rent_station_id
LEFT JOIN station AS s2 ON rental_history.return_station_id = s2.station_id
WHERE rental_history.rent_at BETWEEN '2021-01-01 00:00:00' AND '2021-01-31 23:59:59'
AND rental_history.return_at BETWEEN '2021-01-01 00:00:00' AND '2021-01-31 23:59:59'
GROUP BY s1.local
ORDER BY all_rent DESC
* SUM 사용 시
SELECT s1.local
,COUNT(*) AS all_rent
,SUM(IF(s1.local = s2.local, 1, 0)) AS same_local
,SUM(IF(s1.local <> s2.local, 1, 0)) AS diff_local
FROM station AS s1
LEFT JOIN rental_history ON s1.station_id = rental_history.rent_station_id
LEFT JOIN station AS s2 ON rental_history.return_station_id = s2.station_id
WHERE rental_history.rent_at BETWEEN '2021-01-01 00:00:00' AND '2021-01-31 23:59:59'
AND rental_history.return_at BETWEEN '2021-01-01 00:00:00' AND '2021-01-31 23:59:59'
GROUP BY s1.local
ORDER BY all_rent DESC
다른 것은 전부 동일하고 SELECT 문에 출력되는 방식만 다른데
CASE 문을 썼을 때는 > COUNT를 사용했고
IF 문을 썼을 때는 > SUM을 사용했다.
,COUNT(CASE WHEN s1.local = s2.local THEN 1 ELSE NULL END) AS same_local
-> s1의 local과 s2의 local이 같을 때, 1을 넣고 아니면 NULL
테이블 전체가 아닌 특정 컬럼에 COUNT를 사용할 경우 > NULL 값은 제외하고 집계하므로
1이 입력된 행만 출력해준다.
다만 이 경우(ELSE를 NULL로 했을 경우) SUM을 써주어도 결과는 동일하다.
,SUM(IF(s1.local = s2.local, 1, 0)) AS same_local
-> s1의 local과 s2의 local이 같을 때, 1을 넣고 아니면 0
구하고자 하는 값은 s1의 local과 s2의 local이 같은 경우이므로 이 행들의 합(어차피 1씩 들어가있으므로 행들의 합은 개수와 동일하다)을 구해준다.
만약 여기에 COUNT 함수를 썼다면? 1이 들어간 행, 0이 들어간 행 모두 집계해줄 것이므로 전체 행의 개수와 동일하게 출력된다.
ex.
id | same_local |
---|---|
1 | 1 |
2 | 1 |
3 | 0 |
4 | 1 |
위와 같은 테이블에
SUM을 쓸 경우 > 답은 3으로 잘 출력되지만,
COUNT를 쓸 경우 > 전체 행의 개수를 세주게 되므로 4가 출력된다.
수업을 들을 때 별 거 아니라고 생각하고 넘겼던 것들이
막상 코드를 짤 때 막히는 원인이 되버리는 경우가 많은 것 같다.......
실제로 이 문제를 몇시간동안 씨름했었는데
이번 기회를 계기로 COUNT와 SUM의 각 특징 및 차이를 확실히 인지하고 넘어가는 계기가 되었다 ㅠㅠ