2017-09-23 67 views
1

我想显示百分比评级产品评论表按订单号排序。添加行到最终选择,如果为空查询sql

例如:

:71%

:0%

:0%

:28%

:0%

可以是任何数量的速度不会在产品的评价表中存在(在上面的例子中速率4,3,1在我的表不存在)

DATAS在示例上方插入在我的表。是:

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

我作秀%的查询是:

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 

但我不怎么显示其他费率数字,如果不存在为零百分比。

感谢所有。

+0

您正在过滤productid = 57.所以,您将只有产品ID 57 – 2017-09-23 10:52:53

回答

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;