MySQL分组统计问题:统计指定用户各语言数量并转置列
解决方案:用条件聚合实现行转列统计
我懂你想要的效果——把按行存储的语言记录,转成按列展示每个语言的计数对吧?你之前尝试COUNT、SUM没得到预期结果,应该是没用到条件聚合这个技巧,这正是解决这类行转列统计问题的核心方法。
方法一:用COUNT结合CASE WHEN
SELECT user, COUNT(CASE WHEN lang = 'de' THEN 1 END) AS de, COUNT(CASE WHEN lang = 'en' THEN 1 END) AS en, COUNT(CASE WHEN lang = 'fr' THEN 1 END) AS fr FROM your_table_name -- 替换成你的实际表名 WHERE user = 1 GROUP BY user;
方法二:用SUM结合CASE WHEN
如果更习惯用SUM,也可以这样写,逻辑是完全一致的:
SELECT user, SUM(CASE WHEN lang = 'de' THEN 1 ELSE 0 END) AS de, SUM(CASE WHEN lang = 'en' THEN 1 ELSE 0 END) AS en, SUM(CASE WHEN lang = 'fr' THEN 1 ELSE 0 END) AS fr FROM your_table_name WHERE user = 1 GROUP BY user;
为什么之前的尝试没成功?
- 直接用
COUNT(lang)会统计所有非空的lang值,没办法按语言拆分出单独的列计数; HAVING子句是用来过滤分组后的结果(比如筛选计数大于N的分组),不是用来生成列统计的,所以用在这里不合适。
这两个SQL都会输出你想要的结果:
user de en fr ------------------------------ 1 2 3 1
如果你的语言列表是动态的(以后可能新增其他语言),可以考虑用动态SQL来自动生成列,但如果是固定的几种语言,上面的静态写法简单直接,足够满足需求。
内容的提问来源于stack exchange,提问作者Fuxi




