2015-03-02 96 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