如何统计无关联工单行项目的未开票工单数量?
统计无关联行项目的工单数量的正确SQL方法
你的原SQL语句存在两个关键问题:
- WHERE子句不能直接使用聚合函数:
COUNT()属于聚合函数,需要配合GROUP BY使用,过滤聚合结果要用HAVING而非WHERE。 - 聚合字段选择不准确:
count(workorder_line_items)的写法逻辑模糊,应该针对关联的行项目字段判断是否存在匹配记录。
以下是三种可行的正确统计方法:
方法一:LEFT JOIN + IS NULL(最直观)
通过左连接保留所有工单,筛选出没有对应行项目的记录(行项目字段为NULL):
SELECT COUNT(*) FROM workorders LEFT JOIN workorder_line_items ON workorder_line_items.workorder_id = workorders.id WHERE workorder_line_items.id IS NULL;
方法二:NOT EXISTS子查询(性能更优)
直接检查每个工单是否不存在对应的行项目,适合workorder_id有索引的场景:
SELECT COUNT(*) FROM workorders w WHERE NOT EXISTS ( SELECT 1 FROM workorder_line_items wli WHERE wli.workorder_id = w.id );
方法三:GROUP BY + HAVING(适合需查看单个工单的场景)
先按工单分组,筛选出行项目数量为0的分组后再统计总数:
SELECT COUNT(*) FROM ( SELECT w.id FROM workorders w LEFT JOIN workorder_line_items wli ON wli.workorder_id = w.id GROUP BY w.id HAVING COUNT(wli.id) = 0 ) AS subquery;
内容的提问来源于stack exchange,提问作者Trentfrompunchbowl1
相关产品推荐
相关产品推荐

