SQL Server 2019:如何将多列平均值数据转为纵向行格式
解决方案:SQL Server 实现列转行(逆透视)
你需要的是**逆透视(Unpivot)**操作(Pivot是行转列,和你的需求相反),可以直接用SQL Server内置的UNPIVOT关键字,或者更灵活的CROSS APPLY方法,无需用循环处理,效率更高。
方法1:使用UNPIVOT关键字
SELECT AVERAGENAME, AVERAGESCORE FROM tbl UNPIVOT ( -- 指定数值列的别名 AVERAGESCORE FOR AVERAGENAME IN ( -- 列出需要转换的原列名 P1AVERAGE, P2AVERAGE, P3AVERAGE ) ) AS UnpivotResult -- 可选:按原Id和平均值名称排序,和示例结果顺序一致 ORDER BY Id, AVERAGENAME;
方法2:使用CROSS APPLY(更灵活)
如果需要自定义AVERAGENAME的显示格式(比如改成小写的p1Average),或者后续需要扩展逻辑,CROSS APPLY更适合:
SELECT ca.AVERAGENAME, ca.AVERAGESCORE FROM tbl CROSS APPLY ( VALUES ('p1Average', P1AVERAGE), ('p2Average', P2AVERAGE), ('p3Average', P3AVERAGE) ) AS ca(AVERAGENAME, AVERAGESCORE) -- 可选:按原Id和名称排序 ORDER BY Id, ca.AVERAGENAME;
说明
- 你原来的循环方法属于逐行处理,在SQL中这种方式性能极低,完全没必要——SQL是基于集合的语言,应该用上述集合式操作完成需求。
- 两种方法都能直接得到你需要的输出格式,无需临时表和循环。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

