如果为null query sql,则添加行以进行最终选择

时间:2017-09-23 10:35:42

标签: sql-server

我希望按费率编号显示百分比评分产品评论表。

例如:

5 :71%

4 :0%

3 :0%

2 :28%

1 :0%

也许任何费率号在产品评论表中都不存在。(在上面的例子中,我的表中不存在比率4,3,1)

在上面的示例中插入我的表中的数据是:

Id      CustomerId      ProductId      Rating
------- --------------- -------------- --------
39      14              57             2
42      18              57             5
56      19              57             5

我对show percent的查询是:

SELECT
      pr.ProductId ,
      pr.Rating,
      percentage = AVG(pr.Rating) * 100 / SUM(AVG(pr.Rating)) OVER (PARTITION BY pr.ProductId)
    FROM ProductReview pr  
    WHERE pr.ProductId = 57
    GROUP BY
      pr.ProductId,
      pr.Rating
    ORDER BY pr.Rating DESC

结果我的查询是:

ProductId   Rating      percentage
----------- ----------- -----------
57          5           71
57          2           28

但我不知道如果不存在百分比,如何显示其他费率数字。

感谢所有人。

1 个答案:

答案 0 :(得分:1)

如果您的原始数据没有针对每个产品的评分,那么您必须以某种方式将此信息引入您的查询中。一种选择是日历表方法(因为它用于覆盖数据集中缺少的日期而命名)。在下面的第一个CTE中,我为ProductReview表中的每个产品生成所有评级,1到5。然后,我将此连接到您的原始查询,将每个产品/评级与原始查询中的每个数据点相匹配。如果无法匹配,则我们将百分比显示为零。

WITH cte AS (
    SELECT t1.ProductId, t2.Rating
    FROM (SELECT DISTINCT ProductId FROM ProductReview) t1
    CROSS JOIN
    (
        SELECT 1 AS Rating UNION ALL
        SELECT 2 UNION ALL
        SELECT 3 UNION ALL
        SELECT 4 UNION ALL
        SELECT 5
    ) t2
),
yourQuery AS (
    SELECT
        ProductId,
        Rating,
        AVG(pr.Rating) * 100 /
            SUM(AVG(pr.Rating)) OVER (PARTITION BY pr.ProductId) AS percentage
    FROM ProductReview  
    WHERE ProductId = 57
    GROUP BY ProductId, Rating
)

SELECT
    t1.ProductId,
    t1.Rating,
    COALESCE(t2.percentage, 0) AS percentage
FROM cte t1
LEFT JOIN yourQuery t2
    ON t1.ProductId = t2.ProductId AND
       t1.Rating    = r2.Rating
ORDER BY
    t1.ProductId,
    t1.Rating;