代码之家  ›  专栏  ›  技术社区  ›  Matt Anxo P

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

  •  1
  • Matt Anxo P  · 技术社区  · 14 年前

    我正在尝试编写一个查询,它通过将我选择的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 回复  |  直到 14 年前
        1
  •  3
  •   SQLMenace    14 年前

    当你这样做时会发生什么?

    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

        2
  •  0
  •   Mark Ransom    14 年前

    你的想法是对的,你只是不够深入。

    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 
    
        3
  •  0
  •   bobs    14 年前

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