Я пытаюсь выбрать количество обзоров продуктов по рейтингу, где рейтинг может быть от 0 до 5.
Следующий базовый выбор работает, но не дает подсчет оценок, которых нет в базовой таблице.
SELECT Rating, COUNT(*) AS 'Reviews' FROM ProductReviews
WHERE ProductID = 'product1'
GROUP BY Rating
Я попытался использовать CTE для создания отсутствующих результатов, присоединенных к таблице Reviews с помощью внешнего соединения, как только я попытаюсь включить выражение «group by», результаты возвращаются, чтобы соответствовать результатам из базового запроса.
(Я проверил, что CTE действительно генерирует полный диапазон требуемых значений).
BEGIN
DECLARE @START AS INT = 0;
DECLARE @END AS INT = 5;
WITH CTE_Ratings AS
(
SELECT @START as cte_rating
UNION ALL
SELECT 1 + cte_rating
FROM CTE_Ratings
WHERE cte_rating < @END
)
SELECT
cte_rating AS 'ReviewRating'
, ISNULL(COUNT(*), 0) AS 'ReviewCount'
FROM CTE_Ratings
LEFT OUTER JOIN Reviews ON Reviews.Rating = cte_rating
WHERE ProductReviews.ProductID = 'product1'
AND cte_rating BETWEEN @START AND @END
GROUP BY cte_rating
END
(Я также попытался создать временную таблицу, содержащую необходимые значения, объединенные с таблицей Reviews, с идентичными результатами).
В случае обоих вышеуказанных запросов результаты следующие:
Rating Reviews
0 1
3 3
4 9
5 47
Принимая во внимание, что я пытаюсь получить те же данные:
Rating Reviews
0 1
1 0
2 0
3 3
4 9
5 47
Может ли кто-нибудь предложить, когда добавление агрегатной функции Group By приводит к сбою запроса или как его можно улучшить?