SQL如何统计每个userId的各actionType数量并按类型分列展示
按用户分组统计各操作类型次数(行转列实现)
需求说明
- 基于
history表按userId维度分组统计 - 计算每个用户ID下
ban、unban、mute、unmute四类操作的总触发次数 - 最终结果将四类操作类型分别作为独立列输出
关联表结构
题目给出的history表建表语句如下:
CREATE TABLE history ( userId VARCHAR(40), actionType ENUM('ban', 'unban', 'mute', 'unmute') );
实现SQL
由于actionType是固定的4个枚举值,用条件聚合实现即可,该写法跨数据库兼容性强,适配MySQL、PostgreSQL、Oracle等绝大多数主流数据库:
SELECT userId, SUM(CASE WHEN actionType = 'ban' THEN 1 ELSE 0 END) AS ban_count, SUM(CASE WHEN actionType = 'unban' THEN 1 ELSE 0 END) AS unban_count, SUM(CASE WHEN actionType = 'mute' THEN 1 ELSE 0 END) AS mute_count, SUM(CASE WHEN actionType = 'unmute' THEN 1 ELSE 0 END) AS unmute_count FROM history GROUP BY userId;
注意事项
- 如果使用MySQL环境,可替换为更简洁的
IF语法,统计效果完全一致,示例写法:SUM(IF(actionType = 'ban', 1, 0)) AS ban_count - 上述逻辑中,如果某个用户没有对应类型的操作,对应统计列会返回0,不会出现NULL值
- 部分数据库提供了
PIVOT专用行转列语法,但条件聚合的写法不需要适配数据库方言,通用性更强
内容的提问来源于stack exchange,提问作者PIN
相关产品推荐
相关产品推荐

