2017-09-23 65 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;