1

ベストアプローチとは

アプローチ-I

SELECT 
SUM(CASE WHEN CODE = 'A' THEN ISNULL(UNIT,0.00)+ISNULL(UNIT_1,0.00) END) AS UNIT_SUM
FROM tblA

アプローチⅡ

SELECT 
ISNULL(SUM(CASE WHEN CODE = 'A' THEN UNIT+UNIT_1 END),0.00) AS UNIT_SUM
FROM tblA

1) 私の懸念は、ISNULL を CASE ステートメント内または外部 CASE ステートメント内に配置する必要があるかどうかです。単位の合計に影響しますか、または両方のクエリで同じ結果が得られますか。また、UNIT列にNULL値がある場合はどうなりますか.合計のNULLになりますか.

2) 以下に示すように、CASE ステートメントで ELSE を使用する必要がありますか。

THEN ... ELSE 0.00 END

4

6 に答える 6

2

フィルターを where 句に入れてクエリを高速化する方がよいことを指摘する他の回答が= 'A'あり、それは正しいことです。また、合計する行がない場合、クエリが異なる結果を生成することにも注意してください。

SELECT 
ISNULL(SUM(CASE WHEN CODE = 'A' THEN UNIT END),0.00) AS UNIT_SUM
FROM tblA;
-- output: 0

SELECT 
SUM(CASE WHEN CODE = 'A' THEN ISNULL(UNIT,0.00) END) AS UNIT_SUM
FROM tblA;
-- output: null

すべての行の合計を取得し、このデータを列に入れたい場合は、次のクエリを使用できます。

select
    isnull(sum(case when code = 'A' then unit end), 0) as [A],
    isnull(sum(case when code = 'B' then unit end), 0) as [B]
from tblA
-- filter out rows if there's more codes in your table
where code in ('A', 'B')

sql fiddle demo

于 2013-09-16T07:46:05.443 に答える
1

元の質問への回答:

CASE ステートメント内に ISNULL を配置する必要がありますか?

いいえ、ありません。SUM()s を無視しNULLます。したがって、NULL 値が存在しても、合計の結果には影響しません。例外は、すべての値が NULL の場合、または値がまったくない場合です。その場合NULL、結果として得られます。

CASE ステートメントで ELSE を使用する必要がありますか?

いいえ、同じ理由でそうではありません。

ISNULL()...外で使う必要はありCASEますか..?

NULLすべての値がs の場合、または値がない場合に、結果セットに期待する内容によって異なります。0または 他の値が必要な場合は、ISNULL()またはを使用しますCOALESCE()。そうでなければしないでください。

これがSQLFiddleのデモです

アップデート

変更された質問のような表現を考えると

SUM(CASE WHEN CODE = 'A' THEN UNIT + UNIT_1 END)

ISNULL()またはCOALESCE()両方UNITを使用する可能性が高くUNIT_1、これらの列のいずれかの値が存在しない場合はゼロ値として扱います。その場合、CASE条件に一致する値がなくても結果セットでゼロを取得したい場合は、 or aroundを使用する必要があります。ISNULL()COALESCE()SUM()

SELECT ISNULL(SUM(CASE WHEN CODE = 'A' 
                       THEN ISNULL(UNIT, 0) + ISNULL(UNIT_1, 0) 
                  END), 0) AS UNIT_SUM

また

SELECT COALESCE(SUM(CASE WHEN CODE = 'A' 
                         THEN COALESCE(UNIT, 0) + COALESCE(UNIT_1, 0) 
                    END), 0) AS UNIT_SUM

これがSQLFiddleのデモです

于 2013-09-16T07:47:48.820 に答える