Oracle完整性检查:如何编写SELECT语句查询有无发票供应商并聚合无发票项
实现SQL语句
你可以通过PO_VENDORS和AP_INVOICES的左外连接实现需求,同时通过自定义排序字段实现无发票供应商的聚类排列:
SELECT pv.vendor_id, pv.vendor_name, ai.invoice_id, ai.invoice_num, ai.invoice_amount, -- 可选标记字段,明确标识供应商是否有对应发票 CASE WHEN ai.invoice_id IS NULL THEN '无对应发票' ELSE '有对应发票' END AS invoice_status FROM po_vendors pv LEFT JOIN ap_invoices ai ON pv.vendor_id = ai.vendor_id ORDER BY -- 无发票的供应商统一返回排序值1,有发票的返回2,实现聚类排列 CASE WHEN ai.invoice_id IS NULL THEN 1 ELSE 2 END, pv.vendor_name, ai.invoice_date DESC;
语句说明
- 用
LEFT JOIN保证所有供应商都会被查询出来,不管是否存在关联的发票数据,没有匹配发票的供应商对应的发票相关字段会返回NULL - 排序逻辑里的CASE表达式可以调整返回值顺序,把无发票供应商聚类到查询结果的后半部分
- 排序的第二、第三规则可根据实际需求调整,比如按供应商ID、发票金额排序等
仅需单行列供应商统计结果的写法
如果不需要拉取所有发票明细,只需要统计每个供应商的发票情况,可以用如下聚合写法:
SELECT pv.vendor_id, pv.vendor_name, COUNT(ai.invoice_id) AS invoice_count, CASE WHEN COUNT(ai.invoice_id) = 0 THEN '无对应发票' ELSE '有对应发票' END AS invoice_status FROM po_vendors pv LEFT JOIN ap_invoices ai ON pv.vendor_id = ai.vendor_id GROUP BY pv.vendor_id, pv.vendor_name ORDER BY CASE WHEN COUNT(ai.invoice_id) = 0 THEN 1 ELSE 2 END, pv.vendor_name;
内容的提问来源于stack exchange,提问作者Cristian
相关产品推荐
相关产品推荐

