MySQL:使用DISTINCT SUM、GROUP BY实现行转列统计求助
实现MySQL行转列:按用户分组聚合不同类型的值
这是个很常见的行转列需求,我们可以用GROUP BY搭配条件聚合函数来实现,完全符合你提到的聚合+分组思路,不需要额外的DISTINCT(除非有特殊去重需求,后面会补充说明)。
先明确你的数据和目标:
原始数据表(假设表名为
your_table):
id user_id type value 1 1 type1 2 2 2 type1 1 3 1 type2 5 4 1 type1 2
期望输出:
user_id type1 type2 1 4 5 2 1 0
核心SQL语句
SELECT user_id, -- 累加type1的value,无匹配则返回0 SUM(CASE WHEN type = 'type1' THEN value ELSE 0 END) AS type1, -- 累加type2的value,无匹配则返回0 SUM(CASE WHEN type = 'type2' THEN value ELSE 0 END) AS type2 FROM your_table GROUP BY user_id;
逻辑拆解
GROUP BY user_id:把同一用户的所有行合并为一行,这是分组统计的基础。- 条件聚合
SUM(CASE...):- 对每一行判断
type是否匹配目标类型,匹配就取对应的value,不匹配则取0。 - 用
SUM把同一用户下所有匹配行的value累加,没有匹配行时,累加结果自然为0,刚好满足你要的默认值需求。
- 对每一行判断
特殊场景:去重后求和
如果你的数据里存在同一user_id+type的重复值,需要去重后再求和,可以加上DISTINCT:
SELECT user_id, SUM(DISTINCT CASE WHEN type = 'type1' THEN value ELSE 0 END) AS type1, SUM(DISTINCT CASE WHEN type = 'type2' THEN value ELSE 0 END) AS type2 FROM your_table GROUP BY user_id;
不过你的示例数据中,user_id=1的type1两个2累加后是4,不需要去重,所以第一种写法就完全适用。
内容的提问来源于stack exchange,提问作者user7181459
相关产品推荐
相关产品推荐

