2011-05-12 4 views
3

現在、いくつかのSQLに関する作業を行っていますが、少し問題があります。SUMでNULL値を持つSQLの問題

私は現金取引を探してキャッシュバックを取りますが、時には現金取引がないので、値はNULLになり、NULLから引き出すことはできません。 私はそれの周りにISNULLを入れようとしましたが、それでもnullに変わります。

誰もがこれを手伝ってくれますか?

;WITH tran_payment AS 
(
SELECT 1 AS payment_method, NULL AS payment_amount, null as tran_header_cid 
UNION ALL 
SELECT 998 AS payment_method, 2 AS payment_amount, NULL as tran_header_cid 
), 
paytype AS 
(
SELECT 1 AS mopid, 2 AS mopshort 
), 
tran_header AS 
(
SELECT 1 AS cid 
) 
      SELECT p.mopid      AS mopid, 
        p.mopshort     AS descript, 
        payment_value AS PaymentValue, 
        ISNULL(DeclaredValue, 0.00) AS DeclaredValue 
      from paytype p 
        LEFT OUTER JOIN (SELECT CASE 
         When (tp.payment_method = 1) 
         THEN 
        (ISNULL(SUM(tp.payment_amount), 0) 
        - (SELECT ISNULL(SUM(ABS(tp.payment_amount)), 0) 
          FROM tran_payment tp 
          INNER JOIN tran_header th on tp.tran_header_cid = th.cid 
     WHERE payment_method = 998 
     )) 
    ELSE SUM(tp.payment_amount) 
    END as payment_value, 
    tp.payment_method, 
    0 as DeclaredValue 
    FROM tran_header th 
    LEFT OUTER JOIN tran_payment tp 
    ON tp.tran_header_cid = th.cid 
    GROUP BY payment_method) pmts 
    ON p.mopid = pmts.payment_method 
+1

どのDBMSを使用していますか? –

+0

ELSE句にISNULL()がありませんか? –

+0

@ダニエルISNULLから、私はそれがMSのSQLだと思います – bpgergo

答えて

5

COALESCE()はお手伝いできますか?

あなたはこれを試すことができます。

SUM(COALESCE(tp.payment_amount, 0)) 

または

COALESCE(SUM(tp.payment_amount), 0) 

COALESCE(arg1, arg2, ..., argN)

は、リストから最初の非null引数を返します。

1

試みは、私がここでテストするためにMS SQLを持っていないこの

SUM(ISNULL(tp.payment_amount, 0)) 

SUM(ABS(ISNULL(tp.payment_amount, 0))) 
+1

'SUM'を計算する際に' NULL'値は無視されます。 'SUM(x)'が 'NULL'を返す唯一の時間は、すべての入力が' NULL'であれば、 'ISNULL'の集合体をラップするだけで同じ効果が得られます。 –

1

のように、すなわち実際のフィールドを中心に、SUMやABSの内側ISNULLを置くために、それはISNULLを置くために働くだろうSELECT周辺?たぶんISNULLは、一致する行がない場合、まったくトリガーされません...