You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL计算线索指定时间后呼叫次数时触发Error 1111(分组函数无效使用)问题求助

解决Error 1111:统计actual_sent后的呼叫次数

嗨,你遇到的Error 1111是因为MySQL不允许在聚合函数(比如COUNT())内部嵌套另一个聚合函数(比如MAX())——你在CASE条件里直接用了MAX(CASE WHEN sent != called THEN sent END),这属于嵌套聚合,违反了SQL的执行逻辑(聚合函数是对分组后的数据计算,不能在分组计算过程中再嵌套聚合)。

下面给你两种可行的解决方案,根据你的MySQL版本选择:

方法一:子查询预计算actual_sent(兼容所有MySQL版本)

先通过子查询算出每个rid的actual_sent、总呼叫次数和最后呼叫时间,再将这个结果和原表关联,统计called时间晚于actual_sent的记录数:

SELECT 
    t.rid,
    t.count,
    t.last_called,
    t.actual_sent,
    COALESCE(COUNT(cq.rid), 0) AS net_count
FROM (
    -- 先预计算每个rid的基础统计信息
    SELECT 
        rid,
        COALESCE(COUNT(CASE WHEN status = 'called' THEN rid END), 0) AS count,
        COALESCE(MAX(CASE WHEN status = 'called' THEN called END), 0) AS last_called,
        COALESCE(MAX(CASE WHEN sent != called THEN sent END), 0) AS actual_sent
    FROM myfreshp_crm.cc_queue
    GROUP BY rid
) AS t
LEFT JOIN myfreshp_crm.cc_queue AS cq
    ON t.rid = cq.rid
    AND cq.status = 'called'
    AND cq.called > t.actual_sent
GROUP BY t.rid, t.count, t.last_called, t.actual_sent;

逻辑解释:

  1. 子查询t先完成你原本的统计需求,得到每个rid的actual_sent;
  2. 左连接原表cc_queue,筛选出该rid下状态为called且呼叫时间晚于actual_sent的记录;
  3. 最后对连接后的结果按rid分组,统计符合条件的记录数就是net_count。

方法二:窗口函数简化计算(MySQL 8.0+ 适用)

如果你的MySQL版本是8.0及以上,可以用窗口函数MAX() OVER (PARTITION BY rid)直接在原表中计算每个行对应的actual_sent,再进行聚合,代码更简洁:

SELECT 
    rid,
    COALESCE(COUNT(CASE WHEN status = 'called' THEN 1 END), 0) AS count,
    COALESCE(MAX(CASE WHEN status = 'called' THEN called END), 0) AS last_called,
    COALESCE(MAX(CASE WHEN sent != called THEN sent END), 0) AS actual_sent,
    COALESCE(COUNT(CASE WHEN status = 'called' AND called > actual_sent_window THEN 1 END), 0) AS net_count
FROM (
    SELECT 
        *,
        -- 用窗口函数计算当前rid的actual_sent,每行都能拿到这个值
        COALESCE(MAX(CASE WHEN sent != called THEN sent END) OVER (PARTITION BY rid), 0) AS actual_sent_window
    FROM myfreshp_crm.cc_queue
) AS t
GROUP BY rid;

逻辑解释:

  1. 内层子查询t给每行数据加上actual_sent_window字段,通过窗口函数获取当前rid对应的actual_sent;
  2. 外层聚合时,直接用actual_sent_window作为筛选条件,统计符合要求的呼叫次数。

验证示例数据

用你给出的示例数据测试:

  • rid=3:actual_sent是1396887391,called时间1615090216大于它,所以net_count=1;
  • rid=4:没有called记录,net_count=0。

两种方法都能得到正确结果,你可以根据自己的MySQL版本选择合适的方案~

内容的提问来源于stack exchange,提问作者I wrestled a bear once.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:09:11