SQL PIVOT 函数 PIVOT 是 SQL 中的一种操作,用于将行数据转换为列数据(行转列),常用于数据透视和交叉表报表。同时也可以用此函数实现类似于Excel中的数据透视表的效果。
一、PIVOT函数的基本用法:
SELECT [非透视列],
[第一个透视列] AS [列别名],
[第二个透视列] AS [列别名],
...
FROM
(SELECT [查询列] FROM [表]) AS [源表别名]
PIVOT
(
[聚合函数]([聚合列])
FOR [透视列] IN ([第一个透视值], [第二个透视值], ...)
) AS [透视表别名]
用于展示PIVOT函数的用法我们建立了一个基本数据表,假设有一个销售数据表 Sales:
下面使用函数进行转换,将数据表中的数据行转换为列。
SELECT Product, Q1, Q2
FROM
(
SELECT Product, Quarter, Amount
FROM Sales
) AS SourceTable
PIVOT
(
SUM(Amount)
FOR Quarter IN (Q1, Q2)
) AS PivotTable;
转换后的表状态视图:
| Product | Q1 | Q2 |
|---------|-----|-----|
| A | 100 | 200 |
| B | 150 | 250 |
PIVOT 的反向操作是 UNPIVOT,用于将列转为行。PIVOT 需要指定明确的透视值列表通常需要配合聚合函数使用(SUM, AVG, COUNT等)动态PIVOT在大多数数据库中需要使用动态SQL实现对于大数据集,PIVOT操作可能会影响性能。注意:PIVOT、UNPIVOT是SQL Server 2005 的语法,使用需满足数据库的兼容级别,需要兼容级别大于90,否则计算出的结果可能会与上面的截图不同。
查询兼容级别语法如下:SELECT compatibility_level FROM sys.databases WHERE name = '数据库名';
如果你是跟着上述代码生成的测试数据,则数据表是一张临时表,所以对应的数据库名是Tempdb,SELECT compatibility_level FROM sys.databases WHERE name = 'Tempdb';
修改兼容级别语法如下:ALTER DATABASE 数据库名 SET COMPATIBILITY_LEVEL = 90(必须是当前数据库版本范围内的兼容级别)
不同数据库版本支持的兼容级别如下: