SQL如何按用户分组统计各action字符串的出现次数
问题原因
原SQL存在两处错误,导致结果不符合预期:
- 分组逻辑错误:需求要求按用户维度聚合统计,原语句写的
GROUP BY action是按操作类型分组,和需求的分组维度完全不符 - 未做行转列统计:原语句直接用
COUNT(action)只会统计分组下的总操作数,无法把throw/pickup/craft三类操作的计数拆成独立列输出
正确SQL写法
使用条件聚合即可实现需求,该写法兼容所有主流SQL数据库:
SELECT userid, SUM(CASE WHEN action = 'throw' THEN 1 ELSE 0 END) AS throw, SUM(CASE WHEN action = 'pickup' THEN 1 ELSE 0 END) AS pickup, SUM(CASE WHEN action = 'craft' THEN 1 ELSE 0 END) AS craft FROM `playeractions` GROUP BY userid;
逻辑说明
- 分组字段改为
userid,保证最终结果每个用户仅返回一行统计数据 - 遍历每一行数据时,通过
CASE WHEN匹配当前行的操作类型,匹配到目标操作则记为1,未匹配则记为0,最后用SUM对同个用户下的标记值求和,就能得到该用户对应操作的总执行次数 - 若用户从未执行过某类操作,对应列的求和结果为0,完全匹配预期输出格式
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

