MySQL中避免矩阵式输出,将重复ID的多行数据合并为单行
解决MySQL多行非NULL值合并为单行的问题
刚好碰到过类似的场景,你可以用MySQL的聚合函数+分组来快速解决这个合并行的需求。
当前输出
| Id | Line | L1_C | L1_D | L1_E | L2_F | L2_G | L2_H | L3_I | L3_J | L3_K |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | test | tets | tes | null | null | null | null | null | null |
| 1 | 2 | null | null | null | test | etst | etts | null | null | null |
| 1 | 3 | null | null | null | null | null | null | fgdf | dfgf | fdg |
预期输出
| Id | Line | L1_C | L1_D | L1_E | L2_F | L2_G | L2_H | L3_I | L3_J | L3_K |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | test | tets | tes | test | etst | etts | fgdf | dfgf | fdg |
解决方案SQL
核心思路是按Id分组,然后用MAX()(或MIN())函数提取每个列的非NULL值——因为聚合函数会自动忽略NULL,只保留有效的那个值。如果需要保留最小的Line号,用MIN(Line)即可:
SELECT Id, MIN(Line) AS Line, MAX(L1_C) AS L1_C, MAX(L1_D) AS L1_D, MAX(L1_E) AS L1_E, MAX(L2_F) AS L2_F, MAX(L2_G) AS L2_G, MAX(L2_H) AS L2_H, MAX(L3_I) AS L3_I, MAX(L3_J) AS L3_J, MAX(L3_K) AS L3_K FROM your_table_name -- 替换成你的实际表名 GROUP BY Id;
逻辑说明
GROUP BY Id:将同一个Id的所有行归为一组,确保我们只处理同一实体的分散数据MAX(column):由于每组内每个目标列只有一个非NULL值,MAX()会精准取出这个有效值;如果你的场景中某列可能有多个非NULL值,需要根据业务需求调整(比如用GROUP_CONCAT拼接)MIN(Line):如果业务不需要保留Line列,直接去掉这一行即可;如果要保留最大的Line号,换成MAX(Line)就行
内容的提问来源于stack exchange,提问作者palani 03
相关产品推荐
相关产品推荐

