You need to enable JavaScript to run this app. 如何计算列行数的AVG、MAX、MIN?SQL错误1111问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

如何计算列行数的AVG、MAX、MIN?SQL错误1111问题咨询

工单往来深度统计SQL修正方案

原代码报错根源

  • 聚合函数层级混乱:AVG(COUNT(xxx))属于跨层级的嵌套调用,没有拆分统计粒度的前提下直接同层级嵌套聚合函数,直接触发Error Code: 1111. Invalid use of group function报错
  • 类型计数逻辑错误:COUNT(articleType='IN')会把所有行的布尔判断值全部纳入计数范围,无法实现单独统计IN类型消息的效果
  • 关联逻辑偏差:工单表和消息表直接INNER JOIN,会把没有任何消息的工单过滤掉,导致最终统计的平均值出现偏高的偏差

正确实现思路

整体拆分为两层聚合逻辑,匹配需求的统计目标:

  1. 内层聚合:以单个工单为粒度,统计每个工单下IN、OUT两类消息的各自数量
  2. 外层聚合:以所有工单的单类型消息数为样本,计算全局层面的平均值、最大值、最小值,也就是需要的单工单下各类型消息的平均、最大、最小数量指标

可直接运行的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 13:15:05