如何计算列行数的AVG、MAX、MIN?SQL错误1111问题咨询
工单往来深度统计SQL修正方案
原代码报错根源
- 聚合函数层级混乱:
AVG(COUNT(xxx))属于跨层级的嵌套调用,没有拆分统计粒度的前提下直接同层级嵌套聚合函数,直接触发Error Code: 1111. Invalid use of group function报错 - 类型计数逻辑错误:
COUNT(articleType='IN')会把所有行的布尔判断值全部纳入计数范围,无法实现单独统计IN类型消息的效果 - 关联逻辑偏差:工单表和消息表直接INNER JOIN,会把没有任何消息的工单过滤掉,导致最终统计的平均值出现偏高的偏差
正确实现思路
整体拆分为两层聚合逻辑,匹配需求的统计目标:
- 内层聚合:以单个工单为粒度,统计每个工单下IN、OUT两类消息的各自数量
- 外层聚合:以所有工单的单类型消息数为样本,计算全局层面的平均值、最大值、最小值,也就是需要的单工单下各类型消息的平均、最大、最小数量指标
可直接运行的SQL代码
SELECT -- IN类消息的全局统计指标 AVG(ticket_in_cnt) AS at_in_avg, MAX(ticket_in_cnt) AS at_in_max, MIN(ticket_in_cnt) AS at_in_min, -- OUT类消息的全局统计指标 AVG(ticket_out_cnt) AS at_out_avg, MAX(ticket_out_cnt) AS at_out_max, MIN(ticket_out_cnt) AS at_out_min FROM ( -- 内层:单工单维度的消息计数 SELECT t.ticketId, COUNT(CASE WHEN a.articleType = 'IN' THEN 1 END) AS ticket_in_cnt, COUNT(CASE WHEN a.articleType = 'OUT' THEN 1 END) AS ticket_out_cnt FROM tickets.tickets t LEFT JOIN tickets.articles a ON t.ticketId = a.ticketId GROUP BY t.ticketId ) AS ticket_msg_stat;
关键注意点
- 内层计数用
CASE WHEN做类型筛选,只有匹配对应articleType的行才会被计数,不匹配的行返回NULL,COUNT()会自动跳过NULL值,统计逻辑准确 - 用LEFT JOIN关联两张表,保留所有未产生消息的工单,这类工单的IN/OUT计数会自动记为0,覆盖全量工单样本,避免统计偏差
- 拆分后的两层聚合完全独立,不存在同层级嵌套聚合函数的问题,不会触发原有报错
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

