2011-05-12 40 views
3

我目前正在研究一些sql的东西,但在某个问题上运行。SUM上的NULL值存在SQL问题

我有这种方法,寻找现金交易,并摘下现金返还,但有时没有现金交易,使价值变成了空值,你不能从NULL减去。 我试过在它周围放置一个ISNULL,但它仍然变为空。

任何人都可以帮助我吗?

;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? – 2011-05-12 09:12:51

+0

你可能在你的ELSE子句中缺少一个ISNULL()吗? – 2011-05-12 09:18:02

+0

@Daniel从ISNULL,我想这是MS SQL – bpgergo 2011-05-12 09:21:44

回答

5

也许COALESCE()可以帮助你吗?

你可以试试这个:

SUM(COALESCE(tp.payment_amount, 0)) 

COALESCE(SUM(tp.payment_amount), 0) 

COALESCE(arg1, arg2, ..., argN)返回列表中的第一个非空参数。

1

试图把里面ISNULL SUM和ABS也就是围绕实际的现场,像这样

SUM(ISNULL(tp.payment_amount, 0)) 

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

的事务不应该有任何区别在计算SUM时忽略NULL值。 SUM(x)'返回NULL的唯一时间将是如果所有输入都是NULL,那么只是将集合包装在'ISNULL'中将具有相同的效果。 – 2011-05-12 09:24:44

1

我没有MS SQL在这里做测试,但将努力把ISNULL围绕着SELECT?也许,ISNULL根本没有被触发,如果没有匹配的行...