Разница между ISNULL (SUM (x), 0) ИЛИ SUM (ISNULL (x, 0) в SQL-сервере

Какое из следующих утверждений верно?

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

Или они оба правильны?

Ответ 1

Оба они возвращают то же самое, за исключением случаев, когда вы выполняете запрос на пустой набор результатов.

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) не считается нулевым.

Ответ 2

Попробуйте следующее:

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) - это путь.

Ответ 3

Первый говорит

ВСПЫТЬ каждое поле Продажи, и если поле NULL, обработайте его как ноль.

Второе говорит суммировать поле продаж, и если сумма равна NULL, сообщите об этом вместо нуля...

Однако команда SUM() пропускает NULL (хотя вы будете предупреждены об этом), поэтому первый из них приведет к тому, что вы не получите сообщение об ошибке

Ответ 4

Есть разница да. Если я не ошибаюсь

5 + NULL = NULL

поэтому первый случай

SUM(ISNULL(Sales,0)) AS Sales

изменит значение null на 0 и затем суммирует их, которые вернут 5
, а второй случай

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

Вернул бы null в те же данные