2016-08-19 56 views
0

我已經探索並發現了許多不同的示例,但其中沒有一個似乎可行。我得到的最接近的是over(),但由於語法錯誤而失敗。計算總和中的小計的比例

考慮以下查詢。

select Id, 
    count(*) as Count, 
    sum(Amount) as Sum 
from MyTable 
group by Id 

結果是標識 s的出現的金額值的數量和名單。這很好。不過,我還想說明每個總和的總和有多大。我試過以下。

select Id, 
    count(*) as Count, 
    sum(Amount) as Sum, 
    sum(Amount)/sum(Amount) over() as Ratio 
from MyTable 
group by Id 

它失敗,我不知道如何解決它(主要是因爲超過啄更多的是猜測比穩定的知識)。

回答

2

您需要檢索總量的所有記錄,你可以用下面的操作:

SELECT sum(Amount) FROM MyTable

,並把那在您的查詢的除數爲sum(Amount)。因此,您的查詢看起來象下面這樣:

select Id, 
     count(*) as Count, 
     sum(Amount) as Sum, 
     sum(Amount)/(SELECT sum(Amount) FROM MyTable) as Ratio 
from  MyTable 
group by Id 

如果您Amount數據類型是INT,您可能需要轉換比率爲decimal數據類型。例如:

select Id, 
     count(*) as Count, 
     sum(Amount) as Sum, 
     CAST (sum(Amount) AS NUMERIC(10,2))/(SELECT sum(Amount) FROM MyTable) as Ratio 
from  MyTable 
group by Id 

[編輯]:如果你想使用OVER條款,我建議你多了一個子查詢:

SELECT [Id], [Count], [Sum], [SUM]/SUM([SUM]) OVER (PARTITION BY 1) 
FROM 
(
     select Id, 
        count(*) as Count, 
        sum(Amount) as Sum    
     from  MyTable 
     group by Id 
) as t 
+0

很好的建議。然而,在我的具體情況下,子查詢將是巨大的(連接,輪子,子子選擇等)。我希望有一個懶惰的男人解決方案,嘿嘿。可以使用* over * thingy來完成嗎? –