#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;