我正在尝试编写一个查询,通过划分我通过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.非常感谢。
答案 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
答案 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)或将至少一个整数转换为十进制应避免此问题。