SQL Server 动态行转列
时间: 2023-08-12 12:13:16 浏览: 48
在 SQL Server 中,可以使用 PIVOT 操作符将行转换为列。但是,如果要动态地将行转换为列,即列的数量未知或可能随时间而变化,可以使用动态 SQL 和动态 PIVOT。
下面是一个示例查询,将 Sales 表中的销售数据按年份转换为列:
```
SELECT ProductName, [2017], [2018], [2019]
FROM (
SELECT ProductName, YEAR(OrderDate) AS OrderYear, TotalAmount
FROM Sales
) AS sales
PIVOT (
SUM(TotalAmount)
FOR OrderYear IN ([2017], [2018], [2019])
) AS pivotTable
```
这个查询将 Sales 表中的数据按年份进行汇总,然后使用 PIVOT 将每个年份作为列名,将销售额作为值,生成一个新的表格。但是,如果要动态地将所有年份转换为列,可以使用以下查询:
```
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX);
SET @cols = STUFF(
(
SELECT DISTINCT ',' + QUOTENAME(YEAR(OrderDate))
FROM Sales
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'),
1, 1, ''
);
SET @query = '
SELECT ProductName, ' + @cols + '
FROM (
SELECT ProductName, YEAR(OrderDate) AS OrderYear, TotalAmount
FROM Sales
) AS sales
PIVOT (
SUM(TotalAmount)
FOR OrderYear IN (' + @cols + ')
) AS pivotTable';
EXECUTE(@query);
```
这个查询使用了动态 SQL 的方式,首先生成一个包含所有年份的列名的字符串,然后将其插入到 PIVOT 查询中。这样,无论 Sales 表中有多少个年份,查询都会自动将它们转换为列。