SQL如何转置列结果,按性别统计event_type的对应数量?
实现思路
你需要分两步完成需求:
- 先做列转行(逆透视):把
event_type_1、event_type_2两个列转成维度行,新增字段标注事件类型 - 再做行转列(透视):按事件类型分组,分别统计不同性别的触发次数总和
通用SQL实现(兼容所有主流数据库)
SELECT event_name AS ``, SUM(CASE WHEN sex = 'm' THEN trigger_count ELSE 0 END) AS `m`, SUM(CASE WHEN sex = 'f' THEN trigger_count ELSE 0 END) AS `f` FROM ( -- 列转行:将两个事件列拆分为独立行 SELECT sex, 'event_type_1' AS event_name, event_type_1 AS trigger_count FROM d UNION ALL SELECT sex, 'event_type_2' AS event_name, event_type_2 AS trigger_count FROM d ) AS event_unpivot GROUP BY event_name ORDER BY event_name;
执行上述代码即可得到你要求的输出结果。
支持UNPIVOT语法的数据库简化写法(SQL Server/Oracle适用)
SELECT event_name AS ``, SUM(CASE WHEN sex = 'm' THEN trigger_count ELSE 0 END) AS `m`, SUM(CASE WHEN sex = 'f' THEN trigger_count ELSE 0 END) AS `f` FROM d UNPIVOT ( trigger_count FOR event_name IN (event_type_1, event_type_2) ) AS unpivot_result GROUP BY event_name ORDER BY event_name;
原写法错误说明
你原来的查询是按event_type_1和event_type_2的组合值分组,统计的是不同事件触发组合的人数,和你需要的「单个事件按性别统计触发次数」的逻辑不符,因此得到的结果不符合预期。
内容的提问来源于stack exchange,提问作者logjammin
相关产品推荐
相关产品推荐

