多表统计总数:如何合并3张工单表的状态统计结果?
合并三张工单表统计各状态总数的SQL方案
我来帮你搞定这个多表统计的问题~这里有两种常用的修改方案,你可以根据自己的需求选择:
方案一:合并表后统一统计(推荐)
这种方法先把三张表的状态数据合并成一个临时数据集,再一次性统计各状态的总数,代码更简洁,执行效率也更高(只需要扫描每张表一次)。
SELECT SUM(CASE WHEN status = 9 THEN 1 ELSE 0 END) AS done, SUM(CASE WHEN status = 10 THEN 1 ELSE 0 END) AS Incomplete, SUM(CASE WHEN status = 2 THEN 1 ELSE 0 END) AS New FROM ( -- 合并三张表的status字段,UNION ALL不会去重,适合工单数据无重复的场景 SELECT status FROM ticket1 UNION ALL SELECT status FROM ticket2 UNION ALL SELECT status FROM ticket3 ) AS combined_tickets;
为什么用UNION ALL而不是UNION?
UNION会自动去重合并结果,但工单表的数据应该是独立的(比如不同时间段的工单),不需要去重,UNION ALL的执行速度会更快,也能保留所有原始数据。
方案二:基于原查询修改(易理解)
如果你想沿用原来的子查询思路,只需要把每个状态的统计改成三张表的统计数相加即可,逻辑直观,但表数量多的时候代码会比较冗余。
SELECT -- 三个表中status=9的总数相加 (SELECT COUNT(*) FROM ticket1 WHERE status =9) + (SELECT COUNT(*) FROM ticket2 WHERE status =9) + (SELECT COUNT(*) FROM ticket3 WHERE status =9) AS done, -- 同理统计status=10的总数 (SELECT COUNT(*) FROM ticket1 WHERE status =10) + (SELECT COUNT(*) FROM ticket2 WHERE status =10) + (SELECT COUNT(*) FROM ticket3 WHERE status =10) AS Incomplete, -- 统计status=2的总数 (SELECT COUNT(*) FROM ticket1 WHERE status =2) + (SELECT COUNT(*) FROM ticket2 WHERE status =2) + (SELECT COUNT(*) FROM ticket3 WHERE status =2) AS New;
一般更推荐方案一,尤其是后续可能增加更多工单表的时候,维护起来更方便~
内容的提问来源于stack exchange,提问作者Lutfi Aldi
相关产品推荐
相关产品推荐

