请求协助:查询已提供特定服务但未生成对应账单的工单
解决工单服务未生成账单的查询方案
嘿,我完全懂你现在的困扰——要找出那些已经提供了特定服务,但对应订单里该服务却没生成账单的工单,确实得把几个表的关联逻辑捋顺才行。我先基于常见的业务表结构给你写示例查询,你可以根据自己的实际表名/字段直接替换,之后再拆解思路:
假设的核心表结构
先默认你有这几个关键表(如果你的表结构不同,直接替换字段/表名即可):
work_orders(工单表):存储工单基础信息,比如work_order_id(唯一工单ID)、order_id(关联的订单ID)work_order_services(工单服务关联表):记录工单内已提供的服务,包含work_order_id、service_id(目标服务的ID)、service_provided_date(服务完成日期)invoices(账单表):记录账单头部信息,比如invoice_id、order_idinvoice_line_items(账单明细表):记录账单里的具体服务条目,包含invoice_id、service_id、order_id
高效查询语句(NOT EXISTS 写法)
这种写法性能通常更好,适合数据量较大的场景:
-- 记得把占位符替换成你实际的表名、字段和特定服务ID SELECT wo.work_order_id, wo.order_id, wos.service_id, wos.service_provided_date FROM work_orders wo JOIN work_order_services wos ON wo.work_order_id = wos.work_order_id WHERE -- 筛选你要排查的特定服务 wos.service_id = 'SPECIFIC_SERVICE_ID' -- 核心逻辑:检查该工单+服务组合,有没有对应的账单明细条目 AND NOT EXISTS ( SELECT 1 FROM invoice_line_items ili JOIN invoices i ON ili.invoice_id = i.invoice_id WHERE ili.order_id = wo.order_id AND ili.service_id = wos.service_id );
另一种写法(左连接+空值判断)
如果更习惯用连接的思路,也可以这么写:
SELECT wo.work_order_id, wo.order_id, wos.service_id, wos.service_provided_date FROM work_orders wo JOIN work_order_services wos ON wo.work_order_id = wos.work_order_id -- 左连接账单明细,匹配订单+服务的组合 LEFT JOIN invoice_line_items ili ON ili.order_id = wo.order_id AND ili.service_id = wos.service_id LEFT JOIN invoices i ON ili.invoice_id = i.invoice_id WHERE wos.service_id = 'SPECIFIC_SERVICE_ID' -- 左连接后无匹配结果,说明该服务没生成账单 AND ili.invoice_line_item_id IS NULL;
思路拆解
- 先通过
work_orders和work_order_services关联,拿到所有已提供目标服务的工单记录 - 再通过
NOT EXISTS或左连接的方式,检查这些工单+服务组合,是否在账单明细中存在对应条目——不存在的就是你要找的未生成账单的工单 - 如果需要按时间范围筛选(比如最近一个月的服务),直接在WHERE里加
wos.service_provided_date BETWEEN '2024-01-01' AND '2024-01-31'这类条件就行
要是你的实际表结构和我假设的不一样(比如没有单独的账单明细表,服务直接存在账单主表),可以把你的表结构和字段说明告诉我,我再帮你调整查询语句~
内容的提问来源于stack exchange,提问作者Hozner
相关产品推荐
相关产品推荐

