计算百分比0
问题描述:
我希望每个id_cerinta
返回分组的百分比,怎么样的subcerinteProiect
记录的很多都是根据它们被计算百分比0
id_sarcina
有
acoperire= '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
答
MSDN解释这种行为here:
如果一个整数股息进行整除数,划分的结果是 整数有任何结果的小数部分截断。
此外,100
是INT
埃格尔常数:
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)。
与int
和int
是... int
之间优先级数字数据类型。
所以SUM/COUNT = int(in this case)/int = int
和SUM/COUNT * 100 = int * int = int
。
该解决方案由Aaron提供。
我也这么认为,但结果是现在,0.00 ....所有...我不知道问题在哪里...我有acoperire ='acoperita .... – TBogdan 2012-07-12 16:02:25
@TBogdan你* COPY *我的查询,还是你编辑你现有的查询与你可能会或可能没有注意到的变化?你是否改变了第三行来使用'100.0'而不是'100'? – 2012-07-12 16:07:11
是的,我做了,我试过两种方法,复制和编辑... – TBogdan 2012-07-12 16:09:39