计算百分比0

问题描述:

我希望每个id_cerinta返回分组的百分比,怎么样的subcerinteProiect记录的很多都是根据它们被计算百分比0

enter image description here

分组的 id_sarcinaacoperire= 'acoperita'除以所有 subcerinteProiect录音

我想是这样的:

SELECT 
    id_cerinta, 
    SUM(CASE WHEN acoperire = 'acoperita' THEN 1 ELSE 0 END) 
     /COUNT(*) * 100 AS nr_subcerinte_acoperit 
FROM 
    subcerinteProiect 
GROUP BY 
    id_cerinta 

但它不工作太好。它只返回0 ..

这是由于整数数学。试试这些:

SELECT 5/100, 57/100, 99/100; 

结果均为0

现在试试:

SELECT 5.0/100, 57.0/100, 99.0/100; 

更好的成绩,对不对?

因此,对于你的查询:

SELECT 
    id_cerinta, 
    CONVERT(DECIMAL(5,2), 
     SUM(CASE WHEN acoperire = 'acoperita' THEN 1 ELSE 0 END) 
      /COUNT(*) * 100.0) AS nr_subcerinte_acoperit 
FROM 
    subcerinteProiect 
GROUP BY 
    id_cerinta 
+0

我也这么认为,但结果是现在,0.00 ....所有...我不知道问题在哪里...我有acoperire ='acoperita .... – TBogdan 2012-07-12 16:02:25

+0

@TBogdan你* COPY *我的查询,还是你编辑你现有的查询与你可能会或可能没有注意到的变化?你是否改变了第三行来使用'100.0'而不是'100'? – 2012-07-12 16:07:11

+0

是的,我做了,我试过两种方法,复制和编辑... – TBogdan 2012-07-12 16:09:39

MSDN解释这种行为here

如果一个整数股息进行整除数划分的结果是 整数有任何结果的小数部分截断

此外,100INT埃格尔常数:

SELECT DataType = SQL_VARIANT_PROPERTY(100, 'BaseType'), 
     Precision = SQL_VARIANT_PROPERTY(100, 'Precision'), 
     Scale  = SQL_VARIANT_PROPERTY(100, 'Scale'); 

结果:

DataType Precision Scale 
-------- --------- ----- 
int  10  0 

而且here MSDN说* (Multiply)

返回的数据类型AR有更高的优先权。有关 的更多信息,请参阅Data Type Precedence (Transact-SQL)

intint是... int之间优先级数字数据类型。

所以SUM/COUNT = int(in this case)/int = int

SUM/COUNT * 100 = int * int = int

该解决方案由Aaron提供。