SAP B1中如何用SQL CASE语句在无匹配记录时返回Unpaid值
问题根因
现有查询直接对JDT1日记账分录明细表加WHERE条件筛选目标客户,当客户无对应分录时,条件匹配不到任何数据行,CASE表达式没有可执行的行载体,自然无法输出'Unpaid'结果。如果直接在现有逻辑上加GROUP BY,无匹配行时聚合逻辑没有计算对象,也无法返回预期的默认值。
解决方案
不要直接从JDT1表过滤取值,改用构造固定默认行、左关联匹配日记账分录的写法,不管有没有匹配到分录都能返回结果,后续加GROUP BY逻辑也不会失效。
针对你给出的特定单据查询场景,可直接使用以下代码:
SELECT CASE WHEN T0.Debit = 5921.41 AND T0.RefDate >= [%0] THEN 'Paid' ELSE 'Unpaid' END AS PaymentStatus FROM (SELECT 1 AS placeholder) AS dummy LEFT JOIN JDT1 T0 ON T0.[ContraAct] = 'C004166'
如果后续需要加GROUP BY批量统计多客户的付款状态,将客户主数据表作为主表左关联JDT1即可,参考写法:
SELECT T1.CardCode, T1.CardName, CASE WHEN SUM(T0.Debit) = 5921.41 AND MAX(T0.RefDate) >= [%0] THEN 'Paid' ELSE 'Unpaid' END AS PaymentStatus FROM OCRD T1 -- 客户主数据表作为主表,保证所有客户都能返回对应行 LEFT JOIN JDT1 T0 ON T0.[ContraAct] = T1.CardCode WHERE T1.CardType = 'C' -- 仅筛选客户类型的业务伙伴 GROUP BY T1.CardCode, T1.CardName
注意事项
- 不要把JDT1表的过滤条件写在WHERE子句中,否则左关联会退化为内关联,无分录的客户/单据依然不会返回结果
- SAP B1日记账金额存在浮点数精度误差,不建议直接用等号匹配金额,可改用两值差值小于0.01的方式判断
- 如果是按单据查询付款状态,建议将对应单据主表(如销售发票表OINV)作为主表左关联收付款分录,逻辑比直接查JDT1更严谨
内容的提问来源于stack exchange,提问作者Nick Jones
相关产品推荐
相关产品推荐

