sqlserver 行列转置
时间: 2025-06-17 11:08:38 浏览: 15
### SQL Server 中实现行列转置的方法
#### 行转列 PIVOT 函数
PIVOT 函数允许将行数据聚合并转换为列。其基本语法如下:
```sql
SELECT <non-pivoted column>,
[first pivoted column] AS <column name>,
[second pivoted column] AS <column name>,
...
FROM
(<select statement>) AS <alias>
PIVOT
(
aggregate_function(<column being aggregated>)
FOR
[<column that contains the values that will become column headers>] IN ([<list of columns as identifiers>])
) AS <alias>
```
此语句结构能够有效地将指定的行值转化为新的列头,并通过聚集函数汇总相应数值[^1]。
#### 列转行 UNPIVOT 函数
UNPIVOT 函数则相反,它把多列的数据旋转成单列表格形式展示出来。具体应用时需要注意排序规则的影响,在某些情况下可能需要使用 `collate` 来确保一致性[^3]。
以下是简单的 UNPIVOT 使用案例:
```sql
SELECT PersonID, AttributeName, Value
FROM Persons
UNPIVOT (
Value FOR AttributeName IN (FirstName, LastName, Age)
) AS Unpvt;
```
这段代码将会把原表中的 FirstName、LastName 和 Age 这三列变成两列:AttributeName(表示原来的列名)和Value(代表原来各自行对应的值)。如果涉及到不同字符集间的操作,则应考虑加入适当的 `COLLATE DATABASE_DEFAULT` 以防止潜在的问题[^4]。
另外,当面对更复杂的情况比如跨版本兼容性或是性能优化需求时,还可以采用其他方式如自定义视图或者存储过程来完成类似的变换任务;甚至有时候利用辅助工具或编程语言也可以达到目的[^5]。
#### 示例对比 UNION/UNION ALL 的区别
在处理多列合并到单一列的情况下,可以选用 `UNION` 或者 `UNION ALL` 。其中前者会对最终结果执行去重及排序动作,而后者仅作简单拼接不涉及额外开销,因此一般推荐除非确实有必要去除重复项才选择 `UNION` ,否则优先考虑速度更快的 `UNION ALL` 方案。
阅读全文
相关推荐













