You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动