SQL定制报表开发:发票有无PO编号时的不同ID匹配查询需求
定制发票报表SQL实现方案
嘿,我来帮你搞定这个需要分情况逻辑的发票报表需求!先把核心需求再明确一遍,避免理解偏差:
- 当发票的
PO_Number为空时:提取Segment1-Segment4字段,要求关联的两个ID(推测是发票分配表与科目组合表的关联ID)完全匹配 - 当发票的
PO_Number存在时:同样提取Segment1-Segment4,但要求关联的两个ID不匹配
基于你给出的SQL片段,我整理了两种可行的实现方式,你可以根据自己的业务场景和性能需求选择:
方案一:使用CASE语句在JOIN中实现分情况关联
这种方案适合逻辑紧凑的场景,用一个查询搞定两种情况:
SELECT DISTINCT AID.INVOICE_ID, AID.AMOUNT, AID.PERIOD_NAME, GCC.SEGMENT1, GCC.SEGMENT2, GCC.SEGMENT3, GCC.SEGMENT4 FROM AP_INVOICE_DISTRIBUTIONS AID -- 假设这是发票分配表 JOIN GL_CODE_COMBINATIONS GCC -- 假设这是科目组合表 ON CASE -- 无PO编号时,匹配相同的关联ID WHEN AID.PO_NUMBER IS NULL OR AID.PO_NUMBER = '' THEN AID.CODE_COMBINATION_ID = GCC.CODE_COMBINATION_ID -- 有PO编号时,匹配不同的关联ID ELSE AID.CODE_COMBINATION_ID != GCC.CODE_COMBINATION_ID END -- 可选:添加业务过滤条件,比如发票状态、时间段等 WHERE AID.INVOICE_ID IS NOT NULL
关键说明:
- 我假设关联ID是
CODE_COMBINATION_ID,如果你的业务中“两个ID”是其他字段(比如供应商ID、订单ID),直接替换即可 - 同时处理了
PO_Number为NULL和空字符串的情况,避免遗漏数据 - 保留了你原有的
DISTINCT关键字,确保报表结果没有重复行
方案二:使用UNION ALL拆分两种场景
这种方案把两种逻辑完全分开,可读性更强,大数据量下性能可能更优:
-- 场景1:无PO编号,关联ID相同 SELECT DISTINCT AID.INVOICE_ID, AID.AMOUNT, AID.PERIOD_NAME, GCC.SEGMENT1, GCC.SEGMENT2, GCC.SEGMENT3, GCC.SEGMENT4 FROM AP_INVOICE_DISTRIBUTIONS AID JOIN GL_CODE_COMBINATIONS GCC ON AID.CODE_COMBINATION_ID = GCC.CODE_COMBINATION_ID WHERE (AID.PO_NUMBER IS NULL OR AID.PO_NUMBER = '') UNION ALL -- 场景2:有PO编号,关联ID不同 SELECT DISTINCT AID.INVOICE_ID, AID.AMOUNT, AID.PERIOD_NAME, GCC.SEGMENT1, GCC.SEGMENT2, GCC.SEGMENT3, GCC.SEGMENT4 FROM AP_INVOICE_DISTRIBUTIONS AID JOIN GL_CODE_COMBINATIONS GCC ON AID.CODE_COMBINATION_ID != GCC.CODE_COMBINATION_ID WHERE AID.PO_NUMBER IS NOT NULL AND AID.PO_NUMBER != ''
关键说明:
UNION ALL会保留两个查询的所有结果,不会自动去重(如果两个场景不会产生重复数据,可以去掉DISTINCT进一步提升性能)- 拆分后每个子查询的逻辑更清晰,后续维护或修改单一场景时更方便
最后提醒:
- 请根据你的实际表名、字段名调整上述SQL中的标识
- 如果需要对报表结果排序,可以在末尾添加
ORDER BY AID.INVOICE_ID, AID.PERIOD_NAME这类排序语句
内容的提问来源于stack exchange,提问作者Matt Williams
相关产品推荐
相关产品推荐

