2013-05-01 7 views

答えて

15

は彼らの両方を使用すると、空の結果セットにクエリを実行している場合を除いて同じを返す。

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警告は回避されます。

もう1つの微妙な違いの1つは、結果列のデータ型がISNULL(SUM(Sales),0)であるとみなされ、nullableとはみなされません。

+0

nice @martinsmith –

+0

単語Sの過度の使用エールですか? Sales_CTE WITH (SalesAndNulls) AS( はSELECT 1 UNION SELECT NULL ) SUM(ISNULL(SalesAndNulls、0))SALES1 AS、 ISNULL SELECT (SUM(SalesAndNulls)を、0)SALES2 AS Sales_CTE FROM この結果は警告付きです。 Sales1 = 1 Sales2 = 1 警告:Null値は、集計または他のSET操作によって削除されます。 (1行が該当) – Alborz

+0

@Alborz - はい、それは 'Sales2'バージョンのANSI警告です。空の結果セットに '0'を返し、警告が表示されないようにするには、' ISNULL(SUM(ISNULL(SalesAndNulls、0))、0)AS Sales3'を実行します。 –

2

最初のものは、すべての売上フィールド

SUMまで言うと、フィールドがNULLである場合、ゼロとして扱います。

秒が合計アップ売上フィールドを言うと、合計がNULLであれば、代わりにゼロを報告(あなたはそれについて警告されるでしょうが)...

はしかし、SUM()コマンドは、NULLをスキップ、最初の1が原因となりますので、エラーメッセージ

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を取得します。 NULLを処理したくない場合は、ISNULL(SUM(X)、0)を使用します。

1

違いがあります。私は間違っていないよ場合

5 + NULL = NULL 

ので最初のケース

SUM(ISNULL(Sales,0)) AS Sales 

は0にnull値を変更しますした後、第2ケース

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

ながら5
を返すことになるそれらを合計します同じデータにnullが返される