-1

我试图在此查询中获取十进制值,但无法获取我得到 NULL 值

SELECT CAST(CAST(CAST(SUM(CAST(0 AS INT)) AS DECIMAL(10, 2)) * 100 
/ CAST(NULLIF(SUM(CAST(0 AS INT)) 
+ SUM(CAST(0 AS INT)) + 
SUM(CAST(0 AS INT)), 0)
 AS DECIMAL(10, 2)) AS DECIMAL(10, 2)) AS DECIMAL)

如何获得输出

0.00

而不是此查询中的 null

4

4 回答 4

4

使用 ISNULL 内置函数:

ISNULL(CAST(CAST(CAST(SUM(CAST(0 AS INT)) AS DECIMAL(10, 2)) * 100 / CAST(NULLIF(SUM(CAST(0 AS INT)) + SUM(CAST(0 AS INT)) + SUM(CAST(0 AS INT)), 0) AS DECIMAL(10, 2)) AS DECIMAL(10, 2)) AS DECIMAL), 0) 

http://technet.microsoft.com/es-es/library/ms184325.aspx

于 2013-08-21T13:54:44.097 回答
2

我什至还没有开始理解你正在做的所有转换,但你可以简单地ISNULL在那个表达式上使用:

SELECT ISNULL(<all your calculations here>,0)
于 2013-08-21T13:55:23.427 回答
1

整个表达式的计算结果为 NULL,因为您使用的是以下代码。

NULLIF  (
    SUM (   
        CAST(0 AS INT)
    ) + 
    SUM(    
        CAST(0 AS INT)
    ) + 
    SUM(    CAST(0 AS INT)
    ), 
    0
) 

我将把它分解一下,以便更容易理解。

CAST(0 AS INT) evaluates to 0

SUM( CAST( 0 AS INT ) ) evaluates to 0

SUM( CAST(0 AS INT) ) + 
SUM( CAST(0 AS INT) ) + 
SUM( CAST(0 AS INT) ) also evaluates to 0

因此,将整个表达式包装在 NULLIF(表达式,0)中意味着它以 NULL 的形式出现。

然后,该 null 会传播到计算的其余部分,并导致整个表达式计算为 NULL。

如果您希望它为 0,您应该将整个表达式包装在 ISNULL 或 COALESCE 语句中,或者您可以删除 NULLIF 检查,尽管您实际上想要实现的目标有点不清楚。

于 2013-08-22T14:57:47.280 回答
0

该 SQL 中的 CAST 太多了

如果您不想使用 ISNULL,请使用 CASE,因为您有 NULLIF

SELECT 
  CAST(
    CASE
      WHEN SUM(CAST(0 AS INT)) + SUM(CAST(0 AS INT)) + SUM(CAST(0 AS INT)) = 0 THEN 0
      ELSE SUM(CAST(0 AS INT)) * 100.00 / (SUM(CAST(0 AS INT)) + SUM(CAST(0 AS INT)) + SUM(CAST(0 AS INT)))
  END
  AS DECIMAL(10, 2))

但是,除以零的任何东西都是未定义的或无穷大的:不是零。

于 2013-08-22T13:57:38.793 回答