MySQL汇总查询返回重复值,求各区域工单部分计数方法
解决工单区域部分计数的报表问题
嘿,我来帮你搞定这个区域工单计数的问题!首先,我先基于这类场景的常见数据模型来梳理解决方案——通常会有三个核心表:
tickets:工单表,包含工单ID、发起工单的workstation_id等核心字段workstations:工作站表,记录每个工作站的ID、名称等信息workstation_region_links:工作站与区域的关联表,用来绑定一个工作站对应的多个区域ID
我猜你现在的查询大概是直接按区域分组统计所有关联工单,比如这样:
SELECT r.region_name, COUNT(t.ticket_id) AS total_tickets FROM tickets t JOIN workstation_region_links wl ON t.workstation_id = wl.workstation_id JOIN regions r ON wl.region_id = r.region_id GROUP BY r.region_name;
这个查询会把同一个工单(因为所属工作站关联多个区域)重复统计到多个区域中,导致得到的是绝对总计数,而不是你想要的每个区域对应的工作站发起工单的“部分计数”。
下面分两种最常见的需求给出针对性解决方案:
需求1:拆解区域总计数,查看每个区域下各工作站的工单数量
如果你的目标是要看到每个区域的总计数是由哪些工作站贡献的(也就是区域的“部分计数”),那只需要在分组时加上工作站维度,把统计粒度细化到区域+工作站:
SELECT r.region_name, w.workstation_name, COUNT(t.ticket_id) AS ticket_count FROM tickets t JOIN workstations w ON t.workstation_id = w.workstation_id JOIN workstation_region_links wl ON w.workstation_id = wl.workstation_id JOIN regions r ON wl.region_id = r.region_id GROUP BY r.region_name, w.workstation_name ORDER BY r.region_name, ticket_count DESC;
这个查询会输出每个区域下,各个工作站的工单数量,你可以清晰看到区域总计数的构成,完美实现“部分计数”的需求。
需求2:统计每个区域的工单数量,避免跨区域重复计数
如果你的需求是每个工单只归属到一个区域(比如优先算入工作站的主区域),那需要先确定工单的归属规则。假设workstation_region_links表里有is_primary字段标记工作站的主区域,那么可以这样写:
SELECT r.region_name, COUNT(DISTINCT t.ticket_id) AS unique_ticket_count FROM tickets t JOIN workstation_region_links wl ON t.workstation_id = wl.workstation_id JOIN regions r ON wl.region_id = r.region_id WHERE wl.is_primary = 1 -- 仅统计工单所属工作站主区域的数量 GROUP BY r.region_name;
如果没有主区域标记,也可以用窗口函数给每个工作站的关联区域排序,取第一个关联的区域来统计:
WITH workstation_primary_region AS ( SELECT workstation_id, region_id, ROW_NUMBER() OVER (PARTITION BY workstation_id ORDER BY region_id) AS rn FROM workstation_region_links ) SELECT r.region_name, COUNT(t.ticket_id) AS ticket_count FROM tickets t JOIN workstation_primary_region wpr ON t.workstation_id = wpr.workstation_id AND wpr.rn = 1 JOIN regions r ON wpr.region_id = r.region_id GROUP BY r.region_name;
小提示:报表呈现
拿到这些查询结果后,你可以用表格展示区域+工作站的工单明细,或者用堆叠柱状图直观展示每个区域下各工作站的工单占比,让“部分计数”的结果一目了然。
内容的提问来源于stack exchange,提问作者Santiago Capdevila
相关产品推荐
相关产品推荐

