2015-10-15 155 views
2

我是新來的窗口函數。這是有4種水果的原始桌子。我可以使用PARTITION BY和GROUP BY子句嗎? SQL Server 2012

fruit quantity 
orange 100 
banana 27 
banana 20 
orange 5 
melon 5 
apple 1 
banana 10 
banana 4 
banana 36 
banana 86 
banana 47 
apple 32 
banana 7 
banana 5 
banana 3 

是否有可能將這個變成每個水果構成一切總量的百分比?下面是我想:

fruit  total  percentage 
apple  33   9% 
banana  245   63% 
orange  105   27% 
melon  5   1% 

這裏是我想出來的代碼,但它給我一個錯誤:

SELECT fruit 
, SUM(quantity)/SUM(quantity) OVER() * 100 
FROM fruit_inventory 
GROUP BY fruit 

如果我撤消GROUP BY並刪除第一個SUM(quantity)然後我得到看起來像這樣的多個記錄:

fruit quantity percentage 
apple 1   0% 
apple 32   8% 
banana 27   7% 
banana 20   5% 
banana 10   3% 
banana 4   1% 
banana 36   9% 
banana 86   22% 
banana 47   12% 
banana 7   2% 
banana 5   1% 
banana 3   1% 
melon 5   1% 
orange 100   26% 
orange 5   1% 
+0

在您的OVER子句中添加ORDER BY水果 – Mihai

+0

仍然失敗。我應該刪除什麼? – eek142

+0

錯誤是什麼,可能會嘗試在添加一些偏執之後與100相乘 – Mihai

回答

3

使用合計sum的窗口sum

SELECT Fruit , 
     SUM(Quantity) AS Quantity , 
     SUM(Quantity)/SUM(SUM(Quantity)) OVER() * 100 
FROM @fruitbasket 
GROUP BY Fruit; 
+0

這正是我正在尋找的!我想我開始更多地理解OVER的用法。非常感謝。 – eek142

2

我相信這是你在找什麼:

declare @fruitbasket table 
    (
    Fruit nvarchar(50), 
    Quantity decimal(19, 5) 
    ); 

insert into @fruitbasket 
     (Fruit, Quantity) 
values (N'orange', 100), 
     (N'banana', 27), 
     (N'banana', 20), 
     (N'orange', 5), 
     (N'melon', 5), 
     (N'apple', 1), 
     (N'banana', 10), 
     (N'banana', 4), 
     (N'banana', 36), 
     (N'banana', 86), 
     (N'banana', 47), 
     (N'apple', 32), 
     (N'banana', 7), 
     (N'banana', 5), 
     (N'banana', 3); 

select Fruit, 
     sum(Quantity) as Quantity, 
     sum(Quantity)/(
         select sum(Quantity) as Total 
         from @fruitbasket 
         ) * 100 as PercentageOfTotal 
from @fruitbasket 
group by Fruit; 
+0

我喜歡這個答案,因爲我現在開始更多地使用相關子查詢。 – eek142

0

使用CTE(公用表表達式),您可以得到您想要的結果。總體CTE的確具有更好的性能,並且具有更好的可讀性。

WITH cte AS 
(
    SELECT DISTINCT 
     Fruit 
     ,SUM(Quantity) OVER (PARTITION BY fruit ORDER BY fruit) AS sumProducts 
     ,SUM(SUM(Quantity)) OVER() AS totalProducts 
    FROM stackOverflow 
    GROUP BY 
     Fruit 
     ,Quantity 
) 
SELECT Fruit, CAST(sumProducts AS INT) AS sumProducts, CAST(100 * sumProducts/totalProducts AS DECIMAL(5,2)) AS percentage 
FROM cte