总和为空值的SQL问题
我目前正在做一些sql方面的工作,但遇到了一些问题 我有一个方法,它寻找现金交易,并提取现金返还,但有时没有现金交易,所以值变为NULL,不能从NULL中减去。 我试着在它周围加一个ISNULL,但它仍然变成null 有人能帮我吗总和为空值的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
;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)