SQL: COUNT()와 SUM()의 작동 방식을 이해한다.

2024. 9. 22. 00:40전처리/SQL

 

01 문제: COUNT()와 SUM() 작동 방식의 차이를 이해한다.


문제 URL: Confirmation Rate

 

▶ 작성 코드

SELECT SI.user_id
       -- INFULL 없으면 NULL 떠서 추가 --
       , IFNULL(ROUND(SUM(CO.action = 'confirmed') / COUNT(CO.action),2),0) AS confirmation_rate
FROM Signups AS SI
LEFT JOIN Confirmations AS CO ON SI.user_id = CO.user_id  -- 매칭되지 않으면 NULL --
GROUP BY SI.user_id

▶ 참고 코드

SELECT s.user_id,
       ROUND(
           CASE -- NULL을 0으로 바꿈 --
               WHEN COUNT(c.action) = 0 THEN 0 
               ELSE SUM(c.action = 'confirmed') / COUNT(c.action) 
           END, 
           2) AS confirmation_rate
FROM Signups s
LEFT JOIN Confirmations c ON s.user_id = c.user_id
GROUP BY s.user_id

▶ 조인 결과

1. SUM()은 조건이 참인 경우에만 1을 더하므로, 불리언 값(True 또는 False)에 따라 원하는 대로 'confirmed' 메시지만 정확하게 세어줄 수 있다.

 

2. COUNT()는 조건식이 있더라도 해당 행이 존재하는지 여부만 따지고, 조건이 참인지 여부는 고려하지 않는다.

- COUNT(CO.action = 'confirmed')처럼 작성하더라도 항상 1 또는 NULL로 평가되기 때문이다.

- COUNT(CO.action): CO.action의 총 개수를 센다. 다만 NULL 값이 있는 경우는 포함되지 않는다.

 

3. 따라서 COUNT()는 'confirmed' 상태의 메시지만 카운팅하는 것이 아니라, 해당 행이 있는 모든 경우를 1로 처리한다.

 

02 문제: 나머지를 구하는 조건 수식을 쓸 수 있다.


문제 URL: not-boring-movies

SELECT *
FROM Cinema
WHERE id % 2 = 1
AND description != 'boring'
ORDER BY rating DESC;

1. NOT 말고 NOT IN 까지 써야한다.

2. != 대신 NOT IN, NOT LIKE 도 쓸 수 있다.

3. 나머지는 MOD(ID, 2) = 1 도 쓸 수 있다.