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

MySQL单查询统计forwarded_to_cordroom不同值订单数报错求解

你遇到的报错是因为SQL中使用了聚合函数COUNT()但没有搭配GROUP BY,且SELECT列表中第二个字段没有经过聚合函数处理,不符合only_full_group_by模式的语法要求,同时你原有子查询的写法也无法实现分别统计两个值的需求。

方案1:按状态分组输出两行结果

如果你想要结果为两行,分别对应forwarded_to_cordroom=0和forwarded_to_cordroom=1的统计值,可以直接按该字段分组:

SELECT
    o.forwarded_to_cordroom,
    COUNT(DISTINCT o.order_id) as count
FROM `orders_articles` o
INNER JOIN orders oo ON o.order_id = oo.order_id
WHERE
    (oo.finished_order_date IS NULL OR oo.finished_order_date >= '2021-09-27')
    AND oo.order_date <= '2021-09-27'
GROUP BY o.forwarded_to_cordroom

说明:原有LEFT JOIN实际等同于INNER JOIN,因为WHERE条件中对oo.order_date的判断会自动排除关联不到的空值记录,所以直接改为INNER JOIN性能更优。分组后forwarded_to_cordroom作为分组字段可以直接出现在SELECT列表中,完全符合only_full_group_by的规范。

方案2:一行输出两个状态的统计值

如果你想要在同一行分别得到两个状态的计数,可以使用条件聚合:

SELECT
    COUNT(DISTINCT CASE WHEN o.forwarded_to_cordroom = 1 THEN o.order_id END) AS count_forwarded_1,
    COUNT(DISTINCT CASE WHEN o.forwarded_to_cordroom = 0 THEN o.order_id END) AS count_forwarded_0
FROM `orders_articles` o
INNER JOIN orders oo ON o.order_id = oo.order_id
WHERE
    (oo.finished_order_date IS NULL OR oo.finished_order_date >= '2021-09-27')
    AND oo.order_date <= '2021-09-27'

说明:CASE WHEN会把不符合条件的行返回NULL,而COUNT()不会统计NULL值,因此可以实现分条件计数,整个查询只有聚合结果,不需要GROUP BY,也符合only_full_group_by的要求。

内容的提问来源于stack exchange,提问作者Desory

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:15:04