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

MySQL行转列统计求助:将状态值转为列并统计次数时报错

解决SQL行转列时的"invalid use of group function"错误

嘿,这个错误我之前也踩过坑,咱们来一步步拆解问题并修正你的查询语句:

错误原因分析

你的原查询有两个关键问题导致了"invalid use of group function"错误:

  • 聚合函数嵌套非法:你在MAX()的CASE分支里直接使用了COUNT(*),SQL不允许聚合函数(比如COUNT)嵌套在另一个聚合函数(比如MAX)内部使用,这违反了聚合函数的使用规则。
  • 分组逻辑错误:GROUP BY date, status会让结果按date和status的组合分组,这样会输出两行数据(一行closed,一行open),而不是你期望的按date合并成一行的结果。

修正后的查询语句

这里提供两种常用的正确写法,都能实现你要的行转列统计需求:

方法1:使用SUM(CASE...)统计次数

SELECT 
    date,
    SUM(CASE WHEN `status` = 'closed' THEN 1 ELSE 0 END) AS closed,
    SUM(CASE WHEN `status` = 'open' THEN 1 ELSE 0 END) AS open
FROM orders 
WHERE date = '2018-05-22'
GROUP BY date;

方法2:使用COUNT(CASE...)统计次数

SELECT 
    date,
    COUNT(CASE WHEN `status` = 'closed' THEN 1 END) AS closed,
    COUNT(CASE WHEN `status` = 'open' THEN 1 END) AS open
FROM orders 
WHERE date = '2018-05-22'
GROUP BY date;

逻辑说明

  • SUM方式:当status匹配目标值时返回1,否则返回0,通过SUM累加得到该状态的总出现次数。
  • COUNT方式:COUNT函数会自动忽略NULL值,当status匹配时返回非NULL的1,不匹配时CASE语句默认返回NULL,因此COUNT只会统计匹配的行数。

执行任意一种写法,都能得到你期望的输出:

| date       | closed | open |
|------------|--------|------|
| 2018-05-22 | 3      | 2    |

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:51:03