2

評価ごとに商品レビューの数を選択しようとしています。評価は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集計関数を追加するとクエリが失敗するのはいつか、またはどのように改善できるのか、誰かが提案できますか?

4

1 に答える 1

2

WHEREは、外部テーブルのオプションの行をフィルタリングしているため、OUTERJOINをINNERJOINに変更します。
したがって、外側のテーブルフィルターをJOINに移動します

また、CTEの開始と終了の間ですでにフィルタリングしています

WITH ...
-- CTE here
SELECT
    C.cte_rating AS 'ReviewRating'
    , ISNULL(COUNT(PR.Rating), 0) AS 'ReviewCount'
FROM
   CTE_Ratings C
   LEFT OUTER JOIN
   ProductReviews PR ON C.cte_rating= PR.Rating AND PR.ProductID = 'product1'
GROUP BY
   C.cte_rating

より明確に、あなたは実際にこれを行っています

WITH ...
-- CTE here
SELECT
    C.cte_rating AS 'ReviewRating'
    , ISNULL(COUNT(PR.Rating), 0) AS 'ReviewCount'
FROM
   CTE_Ratings C
   LEFT OUTER JOIN
   (
      SELECT PR.Rating
      FROM ProductReviews
      WHERE ProductID = 'product1'
   ) PR ON C.cte_rating= PR.Rating
GROUP BY
   C.cte_rating
于 2013-01-22T08:47:37.600 に答える