首页 > 解决方案 > SQL如何按包含相同数据的两个不同列进行分组

问题描述

如何将以下数据组合在一起。
请注意,相同的数据可以在不同的列中,也可以在同一列中。

| 身份证 | 手机 | 主页 |
| 1 | 空 | 626... |
| 2 | 626... | 空 |
| 3 | 405... | 空 |
| 4 | 空 | 405... |
| 5 | 626... | 405... |
| 6 | 405... | 626... |

这样它就会产生这个结果

| 组ID | 身份证 |
| 1 | 1 |
| 1 | 2 |
| 1 | 5 |
| 1 | 6 |

| 2 | 3 |
| 2 | 4 |
| 2 | 5 |
| 2 | 6 |


GroupId 可以是随机生成的 ID,例如。NEWID(),它用于识别不同列之间的“重复”
空值被忽略。

标签: sqlsql-servertsql

解决方案


我猜,您需要从,值COALESCE返回非空值,并根据结果对文本进行分组并创建.MobileHomeGroupId

所以你可以申请COALESCE(Mobile, Home)DENSE_RANK() OVER (ORDER BY

请找到带有示例数据的演示:

DECLARE @TestTable TABLE (Id INT, Mobile INT, Home INT);

INSERT INTO @TestTable (Id, Mobile, Home) VALUES
(1, NULL, 626456),
(2, 626456, NULL),
(3, 405123, NULL),
(4, NULL, 405123);

SELECT DENSE_RANK() OVER(ORDER BY COALESCE(Mobile, Home)) AS GroupId,
       Id
FROM @TestTable
ORDER BY Id

这里我ORDER BY根据COALESCE结果使用,您可以根据您的业务需要进行更改。

db <> fiddle 上的演示


推荐阅读