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
相关产品推荐
相关产品推荐

