SQL Server多行转多列:相同ID多行合并为多列的SQL查询写法
SQL Server 同ID多行列转单行实现方案
实现思路
- 先对相同ID的记录分组排序生成行号,最多保留前2条即可覆盖4个症状字段的输出需求,超出部分自动忽略
- 采用条件聚合做列映射,比原生PIVOT语法性能更优,更适配50万行级别的大数据量场景
- 无对应值的位置默认返回空字符串,可按需调整为NULL
完整SQL代码
WITH RankedSymptoms AS ( SELECT ID, SYMPTOM1, SYMPTOM2, -- 相同ID分组内生成行号,排序规则可根据业务需求调整 ROW_NUMBER() OVER (PARTITION BY ID ORDER BY (SELECT 1)) AS rn FROM 你的实际表名 -- 替换为自己的表名 ) SELECT ID, MAX(CASE WHEN rn = 1 THEN SYMPTOM1 ELSE '' END) AS SYMPTOM1, MAX(CASE WHEN rn = 1 THEN SYMPTOM2 ELSE '' END) AS SYMPTOM2, MAX(CASE WHEN rn = 2 THEN SYMPTOM1 ELSE '' END) AS SYMPTOM3, MAX(CASE WHEN rn = 2 THEN SYMPTOM2 ELSE '' END) AS SYMPTOM4 FROM RankedSymptoms WHERE rn <= 2 GROUP BY ID
性能优化建议
- 建议建立覆盖索引提升查询效率,无需回表扫描:
CREATE NONCLUSTERED INDEX IX_表名_ID ON 你的实际表名 (ID) INCLUDE (SYMPTOM1, SYMPTOM2) - 如果有业务排序规则(比如按症状录入时间排序),将
ORDER BY (SELECT 1)替换为对应排序字段即可,不影响整体执行性能
补充说明
如果需要无值位置返回NULL而非空字符串,删除CASE语句中的ELSE ''即可。如果后续需要扩展更多症状输出字段,只需增加CASE映射规则、调整rn的过滤阈值即可。
内容的提问来源于stack exchange,提问作者spiderman
相关产品推荐
相关产品推荐

