評価ごとに商品レビューの数を選択しようとしています。評価は0〜5です。
次の基本的な選択は機能しますが、基になるテーブルに存在しない評価のカウントは提供されません。
SELECT Rating, COUNT(*) AS 'Reviews' FROM ProductReviews
WHERE ProductID = 'product1'
GROUP BY Rating
CTEを使用して欠落している結果を生成し、外部結合を使用してReviewsテーブルに結合しようとしました。「groupby」式を含めようとするとすぐに、結果は基本クエリの結果と一致するようにフォールバックします。
(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
(また、レビューテーブルに結合された、必要な値を含む一時テーブルを作成しようとしましたが、同じ結果になりました)。
上記の両方のクエリの場合、結果は次のようになります。
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集計関数を追加するとクエリが失敗するのはいつか、またはどのように改善できるのか、誰かが提案できますか?