it-swarm.com.de

Unterschied zwischen ISNULL (SUM (x), 0) OR SUM (ISNULL (x, 0)) in SQL Server

Welche der folgenden ist richtig?

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

Oder sind beide richtig?

14
Alborz

Beide geben dasselbe zurück, es sei denn, Sie führen eine Abfrage für eine leere Ergebnismenge aus.

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

Kehrt zurück

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

Die SUM(ISNULL(Sales,0))-Version würde die ANSI-WARNUNGEN zur Aggregation von NULL vermeiden.

Ein weiterer geringfügiger Unterschied besteht darin, dass der Datentyp der Ergebnisspalte von ISNULL(SUM(Sales),0) nicht als nullfähig betrachtet wird.

17
Martin Smith

Der erste sagt

Fassen Sie jedes Umsatzfeld zusammen und behandeln Sie es als Null, wenn das Feld NULL ist.

Im zweiten wird das Umsatzfeld summiert. Wenn die Summe NULL ist, melden Sie stattdessen eine Null.

Der Befehl SUM () überspringt jedoch NULL (obwohl Sie darüber gewarnt werden), so dass Sie beim ersten Befehl die Fehlermeldung nicht erhalten

3
Sparky

Versuche dies:

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

Sie erhalten 21, 21, 0 und NULL. Wenn Sie keine Nullen behandeln möchten, ist ISNULL (SUM (X), 0) der richtige Weg.

3
SQLMason

Es gibt einen Unterschied, ja. Wenn ich nicht falsch liege 

5 + NULL = NULL

also der erste Fall

SUM(ISNULL(Sales,0)) AS Sales

würde den Nullwert in 0 ändern und dann summieren, was 5 zurückgeben würde 
während der zweite Fall

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

Gibt in den gleichen Daten Null zurück

1
John Demetriou