如何使用SQL查询拥有最多邮件工单的CPZName及对应数量?
问题出在哪
你写的SQL有两个明显问题:
- 不能直接嵌套使用
MAX(SUM(...)),SQL不允许这种聚合函数套聚合的写法,而且你连GROUP BY都没加,根本没法按CPZ分组统计数据。 - 没必要关联那么多表——你的
Tickets表本身就有Type和CPZName字段,直接用这张表就能完成查询,多余的关联反而可能导致数据重复或查询效率低下。
正确写法
要实现“找出邮件工单最多的CPZ名称和对应数量”,得先按CPZ分组统计每个区域的邮件数,再筛选出数值最大的结果。以下是两种常用实现方式:
写法一:分组排序取TOP 1
适合大多数SQL数据库(MySQL、PostgreSQL用LIMIT 1,SQL Server替换为TOP 1):
SELECT CPZName, COUNT(*) AS EmailCount FROM Tickets WHERE Type = 'email' GROUP BY CPZName ORDER BY EmailCount DESC LIMIT 1;
如果存在多个CPZ邮件数并列第一的情况,想要把这些区域都查出来,可改用子查询:
SELECT CPZName, EmailCount FROM ( SELECT CPZName, COUNT(*) AS EmailCount, MAX(COUNT(*)) OVER () AS MaxCount FROM Tickets WHERE Type = 'email' GROUP BY CPZName ) AS TempTable WHERE EmailCount = MaxCount;
写法二:窗口函数排序筛选
这种方式更灵活,适合需要处理排名逻辑的场景:
SELECT CPZName, EmailCount FROM ( SELECT CPZName, COUNT(*) AS EmailCount, ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) AS RankNum FROM Tickets WHERE Type = 'email' GROUP BY CPZName ) AS RankedData WHERE RankNum = 1;
要是想保留所有并列第一的记录,把ROW_NUMBER()换成RANK()即可。
特殊情况补充
如果你的Tickets表中Type字段存储的是关联ID(而非直接的'email'字符串),且CPZName存在于关联表ControlledParkingZones中,那才需要恢复必要的表关联,写法如下:
SELECT C.CPZName, COUNT(*) AS EmailCount FROM Tickets T JOIN Types Ty ON T.TypeID = Ty.TypeID JOIN ControlledParkingZones C ON T.CPZCode = C.CPZCode WHERE Ty.Type = 'email' GROUP BY C.CPZName ORDER BY EmailCount DESC LIMIT 1;
内容的提问来源于stack exchange,提问作者user19674077
相关产品推荐
相关产品推荐

