You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL:使用DISTINCT SUM、GROUP BY实现行转列统计求助

实现MySQL行转列:按用户分组聚合不同类型的值

这是个很常见的行转列需求,我们可以用GROUP BY搭配条件聚合函数来实现,完全符合你提到的聚合+分组思路,不需要额外的DISTINCT(除非有特殊去重需求,后面会补充说明)。

先明确你的数据和目标:

原始数据表(假设表名为your_table):

iduser_idtypevalue
11type12
22type11
31type25
41type12

期望输出:

user_idtype1type2
145
210

核心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;

逻辑拆解

  1. GROUP BY user_id:把同一用户的所有行合并为一行,这是分组统计的基础。
  2. 条件聚合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:25:39