SQL Server:在转换后无法获得正确的十进制值

时间:2010-08-18 18:40:22

标签: sql-server-2005 tsql casting aggregate-functions

我正在尝试编写一个查询,通过划分我通过SUM选择的2个聚合数字,给出一个百分比(例如,类似于.885)。但我的结果是0.0而不是正确的数字。所以仅供参考,从2个查询开始,我有:

SELECT SUM(CASE WHEN Status_ID = 1 AND State_ID = 14 THEN 1 ELSE 0 END)
FROM SomeTable

产生158.并且:

SELECT SUM(CASE WHEN State_ID = 14 THEN 1 ELSE 0 END)
FROM SomeTable

收益率203。

现在,如果我这样做的话:

SELECT SUM(CASE WHEN Status_ID = 1 AND State_ID = 14 THEN 1 ELSE 0 END)/SUM(CASE WHEN State_ID = 14 THEN 1 ELSE 0 END)
FROM SomeTable

我会得到0,因为一切都被用作整数。所以我尝试了这个:

SELECT CAST(SUM(CASE WHEN Status_ID = 1 AND State_ID = 14 THEN 1 ELSE 0 END)/SUM(CASE WHEN State_ID = 14 THEN 1 ELSE 0 END) AS DECIMAL(3,1))
FROM SomeTable

但我的结果是0.0。这显然不是我想要的。我想得到.778

我认为我需要单独编译数字,但我尝试了并获得了算术溢出异常。有谁看到我可以采取不同的做法?

我正在使用SQL Server 2005.非常感谢。

3 个答案:

答案 0 :(得分:3)

当你做

时会发生什么
THEN 1.0 ELSE 0.0

你也可以投出你正在划分的每个数字,没有点投射总和

另见

select 3/2 --1
select 3/2.0 --1.500000
select 3/convert(decimal(3,2),2) --1.500000

所以这是一种方式

SELECT SUM(convert(decimal(3,2),
CASE WHEN Status_ID = 1 AND State_ID = 14 THEN 1 ELSE 0 END))/
SUM(convert(decimal(3,2),CASE WHEN State_ID = 14 THEN 1 ELSE 0 END))

要处理除以0,请执行此操作

SELECT CASE SUM(convert(decimal(3,2),CASE WHEN State_ID = 14 THEN 1 ELSE 0 END))
when 0 then 0 else SUM(convert(decimal(3,2),
CASE WHEN Status_ID = 1 AND State_ID = 14 THEN 1 ELSE 0 END))/
SUM(convert(decimal(3,2),CASE WHEN State_ID = 14 THEN 1 ELSE 0 END)) END

另见:SQL Server efficient handling of divide by zero

答案 1 :(得分:0)

你有正确的想法,你只是没有走得太远。

SELECT CAST(SUM(CASE WHEN Status_ID = 1 AND State_ID = 14 THEN 1 ELSE 0 END) AS DECIMAL(3,1))/CAST(SUM(CASE WHEN State_ID = 14 THEN 1 ELSE 0 END) AS DECIMAL(3,1)) 
FROM SomeTable 

答案 2 :(得分:0)

您的表达式正在进行整数除法,然后转换为十进制。您必须更改表达式,以便将除法作为十进制。将常量设置为小数(1.0,0.0)或将至少一个整数转换为十进制应避免此问题。