24

以下哪一项是正确的?

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

或者他们都是正确的?

4

4 回答 4

21

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

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))版本将避免关于聚合的 ANSI 警告NULL

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

于 2013-05-01T16:40:40.997 回答
4

第一个说

对每个 Sales 字段求和,如果该字段为 NULL,则将其视为零。

第二个说总结销售字段,如果总计为 NULL,则改为报告零......

但是,SUM() 命令会跳过 NULL(尽管您会收到警告),因此第一个命令会导致您不会收到错误消息

于 2013-05-01T16:40:53.400 回答
4

尝试这个:

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) 就是要走的路。

于 2013-05-01T16:44:30.963 回答
0

有区别是的。如果我没有记错的话

5 + NULL = NULL

所以第一种情况

SUM(ISNULL(Sales,0)) AS Sales

将 null 值更改为 0,然后将它们相加,这将返回 5
而第二种情况

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

将在相同的数据中返回 null

于 2015-11-23T16:43:37.550 回答