문제

각각의 콘테스트에 대하여 등록된 사용자 비율을 구해서 출력합니다. (소수점 2자리 수 까지)

퍼센트는 내림차순, 콘테스트 아이디는 오름차순으로 정렬합니다.

 

테이블

[Users]

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| user_id     | int     |
| user_name   | varchar |
+-------------+---------+

 

[Register]

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| contest_id  | int     |
| user_id     | int     |
+-------------+---------+

 

[예제]

Input: 
Users table:
+---------+-----------+
| user_id | user_name |
+---------+-----------+
| 6       | Alice     |
| 2       | Bob       |
| 7       | Alex      |
+---------+-----------+
Register table:
+------------+---------+
| contest_id | user_id |
+------------+---------+
| 215        | 6       |
| 209        | 2       |
| 208        | 2       |
| 210        | 6       |
| 208        | 6       |
| 209        | 7       |
| 209        | 6       |
| 215        | 7       |
| 208        | 7       |
| 210        | 2       |
| 207        | 2       |
| 210        | 7       |
+------------+---------+
Output: 
+------------+------------+
| contest_id | percentage |
+------------+------------+
| 208        | 100.0      |
| 209        | 100.0      |
| 210        | 100.0      |
| 215        | 66.67      |
| 207        | 33.33      |
+------------+------------+

 

 

풀이

문제점은 단하나.

과연 어떻게 퍼센트를 구할 것인가? > 전체 유저의 수를 어떻게 가져와서 사용할 것인가

이게 문제였다. Join을 하고 Group을 묶으면 이를 확인하기 어려워지기 때문에 다른 방식을 찾아야했다.

그래서 SELECT에 서브쿼리를 추가하는 방법을 찾았다. 그냥 SELECT 안에 SELECT를 사용하는것이다!

코드는 다음과 같다.

SELECT
    contest_id,
    ROUND(
        100 * COUNT(DISTINCT user_id) / (SELECT count(user_id) FROM Users) 
        ,2) AS percentage
FROM Register
GROUP BY contest_id

 

하지만 아직 놓친 점이 하나 있다. 정렬을 해주어야한다. -> ORDER BY를 사용해서 원하는 컬럼을 오름차순, 내림차순으로 정렬한다.

SELECT
    contest_id,
    ROUND(
        100 * COUNT(DISTINCT user_id) / (SELECT count(user_id) FROM Users) 
        ,2) AS percentage
FROM Register

GROUP BY contest_id
ORDER BY percentage DESC, contest_id ASC

 

+ Recent posts