You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:18:02