将MySQL中按行记录的数据转换成按列记录

时间:2024-10-19 15:11:10

将MySQL中按行记录的数据转换成按列记录

背景

在开发场景中,现系统部分表结构是这样的:

id type value
1 A 10
1 B 20
1 C 30
2 A 40
2 B 50
2 C 60

而我想要的表结构是这样的:

id A B C
1 10 20 30
2 40 50 60

因为后续要和其他表关联,所以在SQL查询时就需要进行行列转换。

实现方案

不难想到这里可以用分组+聚合函数来实现这一需求,曾以为有更好的解决方案,ChatGPT并没有给出,看来并没有。

利用max函数 + case when 语句

这是我自己想到的一个,实际上可以更简短。ai助手首先给出的也是这条。

SELECT MAX(CASE WHEN type = 'A' THEN value END) AS A,
       MAX(CASE WHEN type = 'B' THEN value END) AS B,
       MAX(CASE WHEN type = 'C' THEN value END) AS C
FROM your_table
GROUP BY id;

利用sum函数 + if函数

这是ai助手给的,在数字上是一样的,但是在别的类型上有一点问题,后面说明。

SELECT id,
       SUM(IF(type = 'A', value, 0)) AS A,
       SUM(IF(type = 'B', value, 0)) AS B,
       SUM(IF(type = 'C', value, 0)) AS C
FROM your_table
GROUP BY id;

其他

目测sum+case、max+if应该也是可以的,而且if更短更易读,例如:

SELECT id,
       max(IF(type = 'A', value, 0)) AS A,
       max(IF(type = 'B', value, 0)) AS B,
       max(IF(type = 'C', value, 0)) AS C
FROM your_table
GROUP BY id;

简单测试后发现,上面这条max if语句可以达到目标效果,而sum case、sum if的组合产生的是全数字的结果,对比发现其是截取了左起非数字字符前的所有数字。

例如我想要的效果是(省略表头):

23^张三 2022-12-11
41^李四 2023-7-21

sum的效果则是:

23 2022
41 2023

推测是sum函数对各类型数据做了截取,只转化计算了其中一部分数据。

声明:本文使用八爪鱼rpa工具从gitee自动搬运本人原创(或摘录,会备注出处)博客,如版式错乱请评论私信,如情况紧急或久未回复请致邮 xkm.0jiejie0@qq.com 并备注原委;引用本人笔记的链接正常情况下均可访问,如打不开请查看该链接末尾的笔记标题(右击链接文本,点击 复制链接地址,在文本编辑工具粘贴查看,也可在搜索框粘贴后直接编辑然后搜索),在本人博客手动搜索该标题即可;如遇任何问题,或有更佳方案,欢迎与我沟通!