mysql内连接取记录类似行转列

那天我在一家咖啡馆里看着窗外的人群,突然发生了一个场景。
假设有一家公司记录其员工的年收入。
该数据存储在两个表中,一个名为 jn;一、记录2 01 3 年的数据;另一个叫cn,记录2 01 4 年的数据。
公司想比较2 01 3 年和2 01 4 年每个员工的年收入。

所以他们写了一个这样的SQL查询:
A.ID。
A.姓名,J.年收入领取时间AS‘今年年收入领取时间’; J.发票金额AS‘本年发票金额’; C.“年收入到账时间”为年收入到账时间; C.收入金额为“下一年的收入金额” 从A (选择jn.FID、jn.每年收货时间、jn.收货金额 来自 B'jn' jn.年收入收到时间 其中'2 01 3 -%') J, (cn.FID、cn.年收入收到时间、cn.收到金额 来自 B 'cn' cn.每年收货时间如'2 01 4 -%') C A.ID = J.FID 且 C.FID = A.ID;
该查询的逻辑是从 Employee 表 A 中选择 ID 和姓名,并连接代表 2 01 3 年和 2 01 4 年收入数据的两个子查询 J 和 C。
通过匹配 FID,可以找到每个员工两年的收入信息。

等等,此查询还考虑到某些员工可能只有一年或两年没有收入记录。
实际应用中出现这种情况可能需要采取额外的行动。
然而,至少知道每个员工一年赚多少钱是一个好的开始。

MySQL数据转换:如何高效地实现行列互转和字符串拆分?

呃...这个MySQL转换...很头疼。
2 02 2 年我刚接手一个项目,数据格式很乱。
有行列转换和字符串分割之类的东西。
这让他头疼。

让我们将行更改为列。
我之前用的是5 .7 版本,创建了一个存储过程。
那个循环SUBSTRING_INDEX用起来很麻烦。
您必须自己判断边界条件,例如零值、尾随逗号和各种情况。
它会创建大量代码并且容易出错。
当时我想如果我能使用 JSON_TABLE 就好了。
2 02 2 年,MySQL 8 .0已经相当流行,JSON_TABLE的性能也好很多。
直接将字符串转换为JSON数组,然后拆分。
一行代码比存储过程好得多。
底线是高版本使用JSON_TABLE,而低版本只能自己做足够的食物和衣服。

将列更改为行更容易。
只需使用 UNION ALL 组合所有列即可。
例如,有三列,type1 、type2 和type3 ,我想将它们转换为单列。
只需要写一个UNION ALL,分别选择每一列,并添加一个foreign_id字段来标记它来自哪个原始列。
这将形成一个一对多的表。
但是如果列太多怎么办?把UNION ALL敲死也是相当烦人的。
当时我就想,能不能动态生成SQL呢?例如,使用脚本自动生成这些 UNION ALL 语句。
但这也没用,太复杂了。

在优化方面,版本控制非常重要。
MySQL8 .0+,使用JSON_TABLE和窗口函数很棒。
对于MySQL 5 .7 及以下版本,只需使用存储过程,或者仅在应用层处理它们。
为了性能优化,当对大表进行分区时,必须先对其进行过滤。
例如,WHERE id IN (...) 仅处理必要的部分。
拆分后,仍然需要添加索引,例如(id,foreign_id),否则搜索会很慢。
您还应该注意错误处理。
分割字符串时,如果字符串中有非法字符,比如非数字,怎么办?列转行时,如果原列有NULL值,UNION ALL会出现问题,需要使用IFNULL或COALESCE来处理。

举个例子吧。
场景 1 ,行到列。
MySQL8 .0+,分割逗号字符串是JSON_TABLE的使用。
将逗号替换为 JSON 数组格式,并使用 JSON_TABLE 进行分割。
场景2 ,列变行。
这是 UNION ALL 的示例。
分别选择每一列并添加一个 col_name 字段来描述它。

总之,这些方法都可以直接在MySQL中完成。
无需导出或导入,省去了很多麻烦。
实际使用时要看具体情况,比如表结构、数据量、MySQL版本等。
有时简单的方法是最有效的。
好吧,就是这样。