SQL Server如何实现列转行并保留首列在每行重复显示
SQL Server 列转行并保留首列重复的实现方法
你可以通过以下两种常用方案实现需求,两种方案都能自动将第一列Material的值在转换后的每一行重复展示:
方法1:使用 UNPIVOT 原生列转行运算符
UNPIVOT是SQL Server专门为列转行场景设计的语法,写法简洁,适合固定列的转换场景:
SELECT Material, Quantity FROM ( -- 原有基础查询 SELECT TOP 1 Material, Past, WK1_05_23, WK2_05_30, WK3_06_06 FROM Forecast ) source_table UNPIVOT ( -- 转换后的值列命名为Quantity,原列名存在WeekCol字段中(不需要可忽略不查) Quantity FOR WeekCol IN (Past, WK1_05_23, WK2_05_30, WK3_06_06) ) unpivot_result
执行结果和你预期的格式完全匹配,如果需要区分每个Quantity来自原表的哪一列,可以把WeekCol字段也加入SELECT查询列表。
方法2:使用 CROSS APPLY 配合 VALUES 构造行
这种写法更灵活,不需要记忆专用语法,支持自定义转换逻辑,多数场景下性能和UNPIVOT相当:
SELECT t.Material, v.Quantity FROM ( -- 原有基础查询 SELECT TOP 1 Material, Past, WK1_05_23, WK2_05_30, WK3_06_06 FROM Forecast ) t CROSS APPLY ( -- 每一个括号对应转换后的一行,填入需要拆成行的原列即可 VALUES (Past), (WK1_05_23), (WK2_05_30), (WK3_06_06) ) v(Quantity)
如果后续需要新增要转换的列,只需要在VALUES里新增一行括号填入对应列名即可,维护成本更低。
两种方案都支持多Material行的转换,如果去掉
TOP 1查询多个物料,每个物料的数值会独立拆分成对应行,不会出现数据串错的问题。
内容的提问来源于stack exchange,提问作者Trung Tran
相关产品推荐
相关产品推荐

