[SQL][База данных] Как подсчитать количество идентификаторов отзывов для каждой звезды продукта в SQL?

#sql #database

Вопрос:

У меня есть две таблицы, Продукты и Обзор. Существуют следующие атрибуты:
Продукт( идентификатор (PK), название)
Обзор( идентификатор(PK), prod_id(FK), название)
Примеры данных для продуктов

  -------- ---------- 
|id      |name      |
 -------- ---------- 
|1       |fruit     |
|2       |milk      |
|3       |clothes   |
 -------- ---------- 
 

Образцы данных для ознакомления

  --- -------- ----- 
|id |prod_id |star |
 --- -------- ----- 
|1  |1       |5    |
|2  |1       |5    |
|3  |1       |5    |
|4  |1       |4    |
|5  |1       |4    |
|6  |1       |1    |
|7  |2       |5    |
|8  |2       |2    |
|9  |3       |5    |
|10 |3       |5    |
|11 |3       |5    |
 --- -------- ----- 
 

Я хочу подсчитать количество идентификаторов отзывов каждой группы звезд по идентификатору продукта
Цель, которую я хочу:

  -------- ---------- ---------- ----------- --------- --------- 
|prod_id |five_star |four_star |three_star |two_star |one_star |
 -------- ---------- ---------- ----------- --------- --------- 
|1       |3         |2         |0          |0        |1        |
|2       |1         |0         |0          |1        |0        |
|3       |3         |0         |0          |0        |0        |
 -------- ---------- ---------- ----------- --------- --------- 
 

Я пытался использовать этот запрос, но это неправильно:

 select R.prod_id,
    count(distinct case when R.star = 5 then R.id else 0 end) as five,
    count(distinct case when R.star = 4 then R.id else 0 end) as four,
    count(distinct case when R.star = 3 then R.id else 0 end) as three,
    count(distinct case when R.star = 2 then R.id else 0 end) as two,
    count(distinct case when R.star = 1 then R.id else 0 end) as one
from Review as R 
group by R.prod_id;
 

Ответ №1:

Ваш подход на правильном пути, но вам нужны условные подсчеты:

 SELECT
    prod_id,
    COUNT(CASE WHEN star = 5 THEN 1 END) AS five,
    COUNT(CASE WHEN star = 4 THEN 1 END) AS four,
    COUNT(CASE WHEN star = 3 THEN 1 END) AS three,
    COUNT(CASE WHEN star = 2 THEN 1 END) AS two,
    COUNT(CASE WHEN star = 1 THEN 1 END) AS one
FROM Review
GROUP BY
    prod_id;