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
相关产品推荐
相关产品推荐

