我希望按费率编号显示百分比评分产品评论表。
例如:
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
但我不知道如果不存在百分比,如何显示其他费率数字。
感谢所有人。
答案 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;