Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
总和为空值的SQL问题_Sql - Fatal编程技术网

总和为空值的SQL问题

总和为空值的SQL问题,sql,Sql,我目前正在做一些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_me

我目前正在做一些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  

尝试将ISNULL放在SUM和ABS中,即放在实际字段周围,如下所示

SUM(ISNULL(tp.payment_amount, 0))

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

我这里没有要测试的MS SQL,但是将
ISNULL
放在
SELECT
周围是否有效?可能,
ISNULL
根本不会被触发,如果没有匹配的行…

可能
COALESCE()
可以帮助您吗

您可以尝试以下方法:

SUM(COALESCE(tp.payment_amount, 0))


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

您使用的是什么DBMS?您的ELSE子句中是否缺少ISNULL()?@Daniel from ISNULL,我猜是MS sqln请给出您的整个查询。目前看来,它似乎是从
paytype p
开始的。用整个select语句更新了它。应该不会有任何区别
NULL
值在计算
总和时被忽略。
SUM(x)
返回
NULL
的唯一时间是,如果所有输入都是
NULL
,则仅将聚合包装在
ISNULL
中将具有相同的效果。
COALESCE(SUM(tp.payment_amount), 0)