본문 바로가기
Data Science/SQL

[SQL/오답] 비율(Percentage) 산출의 정석: COUNT 대신 AVG(CASE WHEN)을 써야 하는 이유 (LeetCode1211 Easy)

by 에르모사 쩐뉴 2026. 2. 8.

[리트코드] |1211. Queries Quality and Percentage; CASE WHEN 비율문제!

https://leetcode.com/problems/queries-quality-and-percentage/

 

1. Problem

각 쿼리명(query_name)별로 두 가지 지표를 계산해야 한다.

  1. Quality: (평점 / 노출 순위)의 평균값
  2. Poor Query Percentage: 평점이 3점 미만인 데이터가 전체에서 차지하는 비율(%) 단순한 집계를 넘어, 특정 조건을 만족하는 데이터의 '비중'을 어떻게 계산할 것인가가 문제의 핵심이다.

2. Solution: AVG(CASE WHEN) 패턴의 마법

조건에 맞는 경우 1, 아니면 0을 부여한 뒤 이 값들의 평균을 내면 곧바로 비율이 된다.

3. Takeaway: 왜 COUNT보다 AVG(CASE WHEN)이 객관적으로 우수한가?

  • COUNT의 함정 (유진 님의 오답 분석):
    • COUNT(rating < 3)은 괄호 안의 결과가 TRUE(1)이든 FALSE(0)이든 값이 존재하기만 하면 모두 카운트해버린다. 따라서 조건별 개수를 세려면 COUNT(CASE WHEN 조건 THEN 1 END)처럼 ELSE NULL을 활용해야 하는 번거로움이 있다.
  • AVG를 활용한 비율 계산의 우아함:
    • 특정 조건에 10을 부여하고 평균을 내는 방식은 **(조건 만족 개수 / 전체 개수)**라는 비율의 정의와 정확히 일치한다.
    • 코드가 훨씬 간결해지며, 가독성 측면에서도 "이 조건의 비중을 구한다"는 의도가 명확히 전달된다.
  • 데이터 정합성: 소수점 처리(ROUND)와 백분율 변환(* 100)의 순서를 명확히 하여 연산 오류를 방지하는 습관이 중요하다.
Table: Queries

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| query_name  | varchar |
| result      | varchar |
| position    | int     |
| rating      | int     |
+-------------+---------+
This table may have duplicate rows.
This table contains information collected from some queries on a database.
The position column has a value from 1 to 500.
The rating column has a value from 1 to 5. Query with rating less than 3 is a poor query.
 

We define query quality as:

The average of the ratio between query rating and its position.

We also define poor query percentage as:

The percentage of all queries with rating less than 3.

Write a solution to find each query_name, the quality and poor_query_percentage.

Both quality and poor_query_percentage should be rounded to 2 decimal places.

Return the result table in any order.

The result format is in the following example.

 

Example 1:

Input: 
Queries table:
+------------+-------------------+----------+--------+
| query_name | result            | position | rating |
+------------+-------------------+----------+--------+
| Dog        | Golden Retriever  | 1        | 5      |
| Dog        | German Shepherd   | 2        | 5      |
| Dog        | Mule              | 200      | 1      |
| Cat        | Shirazi           | 5        | 2      |
| Cat        | Siamese           | 3        | 3      |
| Cat        | Sphynx            | 7        | 4      |
+------------+-------------------+----------+--------+
Output: 
+------------+---------+-----------------------+
| query_name | quality | poor_query_percentage |
+------------+---------+-----------------------+
| Dog        | 2.50    | 33.33                 |
| Cat        | 0.66    | 33.33                 |
+------------+---------+-----------------------+
Explanation: 
Dog queries quality is ((5 / 1) + (5 / 2) + (1 / 200)) / 3 = 2.50
Dog queries poor_ query_percentage is (1 / 3) * 100 = 33.33

Cat queries quality equals ((2 / 5) + (3 / 3) + (4 / 7)) / 3 = 0.66
Cat queries poor_ query_percentage is (1 / 3) * 100 = 33.33

 

 

1. 정답 쿼리

SELECT query_name, 
       ROUND(AVG(rating / position),2) AS quality, 
       ROUND(AVG(CASE WHEN rating <3 THEN 1 ELSE 0 END)*100,2) AS poor_query_percentage
FROM Queries
GROUP BY query_name;

 

2. 나의 답안

SELECT query_name, 
       ROUND(AVG(rating / position),2) AS quality, 
       COUNT(RATING <3)/COUNT(*)AS poor_query_percentage # 비율문제를 COUNT로 접근하는 하수!!!
FROM QUERIES
GROUP BY query_name