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

MySQL将多行扣除数据合并为单行展示的问题求助

MySQL代码问题分析与修正方案

原代码存在的问题

  • 字符串常量未加引号:Home Rent和GPF是字符串类型的常量值,必须用单引号包裹,否则MySQL会将其识别为列名,直接触发报错。
  • 无关联条件导致笛卡尔积:直接用逗号关联两张同表实例,未指定a.id = b.id这类关联条件,会让两张表的所有行无规则匹配,生成大量错误冗余数据。
  • 输出冗余列:SELECT a.*会把原表的id、name、deduction、amount全查出来,和后面定义的home_rent、gpf重复,不符合目标报表的列结构。
  • 未处理name字段不一致:原数据中同一id下的name分别是teat和test,目标报表取teat,原代码没做对应处理,可能导致结果中name混乱。

修正方案

方案一:条件聚合(推荐,扩展性强)

通过CASE WHEN结合聚合函数,将同一id下的不同扣除项转为列,适合后续新增扣除项的场景:

SELECT 
    id,
    MAX(CASE WHEN name = 'teat' THEN name END) AS name,
    MAX(CASE WHEN deduction = 'Home Rent' THEN amount END) AS home_rent,
    MAX(CASE WHEN deduction = 'GPF' THEN amount END) AS gpf
FROM my_table
GROUP BY id;

方案二:带关联条件的自关联

如果仅需处理固定的两个扣除项,可通过JOIN加关联条件实现,同时避免冗余列:

SELECT 
    a.id,
    a.name,
    a.amount AS home_rent,
    b.amount AS gpf
FROM my_table a
INNER JOIN my_table b ON a.id = b.id
WHERE a.deduction = 'Home Rent' 
  AND b.deduction = 'GPF'
  AND a.name = 'teat'; -- 指定取目标name值

内容的提问来源于stack exchange,提问作者Bhavesh Sahu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:40:28