Porcentaje De Usuarios Que Participaron En Un Concurso

Escribe una soluci贸n para hallar el porcentaje de usuarios inscritos en cada concurso redondeado a dos decimales. Devuelve la tabla de resultados ordenada por porcentaje en orden descendente. En caso de empate, ordenarlo por contest_id en orden ascendente.

#database#basic-aggregate

Table: Users

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

- `user_id` es la llave primaria (columna con valores 煤nicos) para esta tabla.
- Cada fila de esta tabla contiene el nombre y el id de un usuario.

Table: Register

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

- (`contest_id`, `user_id`) es la llave primaria (combinaci贸n de columnas con valores 煤nicos) para esta tabla.
- Cada fila de esta tabla contiene el id de un usuario y el concurso al que se registraron.

El formato del resultado es el del siguiente ejemplo.

Ejemplo 1:

Entrada:

Tabla Users:
+---------+-----------+
| user_id | user_name |
+---------+-----------+
| 6       | Alice     |
| 2       | Bob       |
| 7       | Alex      |
+---------+-----------+

Tabla Register:
+------------+---------+
| 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       |
+------------+---------+

Salida:

+------------+------------+
| contest_id | percentage |
+------------+------------+
| 208        | 100.0      |
| 209        | 100.0      |
| 210        | 100.0      |
| 215        | 66.67      |
| 207        | 33.33      |
+------------+------------+

Explicaci贸n:
- Todos los usuarios registrados en los concursos 208, 209, y 210. El porcentaje es 100% y los ordenamos en por `contest_id` en orden ascendente.
- Alice y Alex se registraron en el concurso 215 y el porcentaje es ((2/3) * 100) = 66.67%
- Bob se registr贸 en el concurso 207 y el porcentaje es ((1/3) * 100) = 33.33%

Soluci贸n:

WITH usersCount AS (
    SELECT count(*) AS totalUsers from users
)
SELECT contest_id,
       ROUND(100 * count(users.user_id) / totalUsers, 2) AS percentage
FROM usersCount, register, users
WHERE users.user_id = register.user_id
GROUP BY contest_id
ORDER BY percentage DESC, contest_id ASC;

slackmart blog 漏 2024