2015-03-02 253 views
0

我正在嘗試計算'mktcoupons'中的重複次數並生成重複項的百分比,以便所有百分比的總和等於1。但是,我所有的百分比都是零。任何建議?謝謝。通過組合2個SQL聚合函數來計算百分比總計

select mktcoupons, count(*) as countof, 
    count(*)/(select count(*) from X) as percentage 
from X 
group by mktcoupons 

結果是這樣的:

mktcoupons countof percentage 
1 2334909 0 
2 2725208 0 
3 224979 0 
4 24987 0 
5 2032 0 
6 341  0 
7 62  0 
8 13  0 
9 5  0 
10 1  0 

回答

0

SQL Server會整數除法。您可以顯式將值轉換爲帶有小數點的數字。我經常乘以1.0:

select mktcoupons, count(*) as countof, 
    count(*)/(select 1.0*count(*) from X) as percentage 
from X 
group by mktcoupons; 

也就是說,你不需要這個查詢的子查詢。您可以使用窗口函數來代替:

select mktcoupons, count(*) as countof, 
     count(*)/sum(1.0 * count(*)) over() as percentage 
from X 
group by mktcoupons; 

當你有一個複雜的WHERE條款或JOIN是你們等會在子查詢複製這是特別有幫助。

+0

謝謝!你的兩個查詢都很好用!我仍然試圖弄清楚爲什麼count(*)需要乘以1.0。 (來自X的Count(*))返回一個整數。將整數乘以1.0會使它更「整數」嗎? – May 2015-03-02 14:14:58

+0

@五月。 。 。 SQL Server對整數進行整數運算,所以3/2 = 1,而不是1.5。這會影響平均值和分割。乘以1.0(或更好的顯式轉換)將其轉換爲具有小數位的數字。 – 2015-03-02 14:31:13

+0

@戈登......謝謝!現在我明白了爲什麼,我將計算百分比的查詢部分更改爲(1.0 * count(*))/(從X中選擇count(*))並且它也起作用。所以看起來我可以將分母或分子乘以1.0以使這個技巧奏效! – May 2015-03-02 14:42:56