SQL服务器中ISNULL(SUM(x),0)或SUM(ISNULL(x,0)之间的差异

时间:2013-05-01 16:37:23

标签: sql-server sql-server-2008

以下哪一项是正确的?

        SUM(ISNULL(Sales,0)) AS Sales,
        ISNULL(SUM(Sales),0) AS Sales,

或者他们都是正确的吗?

3 个答案:

答案 0 :(得分:17)

除非您在空结果集上运行查询,否则它们都返回相同的内容。

WITH Sales(Sales) AS
(
SELECT 1
)
SELECT
        SUM(ISNULL(Sales,0)) AS Sales,
        ISNULL(SUM(Sales),0) AS Sales
FROM     Sales    
WHERE 1=0

返回

Sales       Sales
----------- -----------
NULL        0

SUM(ISNULL(Sales,0))版本可以避免有关汇总NULL的ANSI警告。

另一个细微差别是ISNULL(SUM(Sales),0)的结果列的数据类型不被视为可为空。

答案 1 :(得分:3)

第一个说

汇总每个销售字段,如果该字段为NULL,则将其视为零。

第二个表示总结销售字段,如果总计为NULL,则报告零而不是......

但是,SUM()命令会跳过NULL(虽然你会收到警告),所以第一个命令会导致你不能收到错误消息

答案 2 :(得分:3)

试试这个:

DECLARE @table TABLE
(
  id INT IDENTITY,
  Alborz INT
)
INSERT  INTO @table
        SELECT  1
        UNION ALL
        SELECT  1
        UNION ALL
        SELECT  1
        UNION ALL
        SELECT  1
        UNION ALL
        SELECT  1
        UNION ALL
        SELECT  NULL

SELECT  ISNULL(SUM(Alborz), 0)
FROM    @table
SELECT  SUM(ISNULL(Alborz, 0))
FROM    @table

DELETE  FROM @table

SELECT  ISNULL(SUM(Alborz), 0)
FROM    @table
SELECT  SUM(ISNULL(Alborz, 0))
FROM    @table

你会得到21,21,0和NULL。如果你不想处理空值,那么ISNULL(SUM(X),0)就是你的选择。