2024年6月12日发(作者:)

龙源期刊网

SQL server 2008数据库查询中的数据透视

与数据逆透视

作者:桂云秋 周扬 刘宝 朱臣

来源:《科教导刊·电子版》2016年第32期

摘 要 使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表。PIVOT 通过将

表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中

所需的任何其余列值执行聚合。UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换

为列值。

关键词 SQL server2008 数据透视 数据逆透视

中图分类号:TP311 文献标识码:A

使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表。PIVOT 通过将表达

式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需

的任何其余列值执行聚合。UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换为列

值。

1 PIVOT 和 UNPIVOT函数语法

以下是带批注的 PIVOT 语法。

SELECT ,

[first pivoted column] AS ,

[second pivoted column] AS ,

[last pivoted column] AS

FROM

()

AS

PIVOT

龙源期刊网

()

FOR

[]

IN ( [first pivoted column], [second pivoted column],

[last pivoted column])

) AS

pivot_column 和 value_column 是 PIVOT 运算符使用的组合列。PIVOT 遵循以下过程获得

输出结果集:对分组列的 input_table 执行 GROUP BY,为每个组生成一个输出行。输出行中

的分组列获得 input_table 中该组的对应列值。通过执行以下操作,为每个输出行生成列列表中

的列的值:针对 pivot_column,对上一步在 GROUP BY 中生成的行另外进行分组。对于

column_list 中的每个输出列,选择满足以下条件的子组:pivot_column = CONVERT(,

'output_column') 针对此子组上的 aggregate_function 对 value_column 求值,其结果作为相应的

output_column 的值返回。如果该子组为空,SQL Server 将为该 output_column 生成 Null 值。如

果聚合函数是 COUNT,且子组为空,则返回零 (0)。

2 PIVOT函数应用

可能会用到 PIVOT 的常见情况是:需要生成交叉表格报表以汇总数据。例如,假设需要

在 AdventureWorks 示例数据库中查询 PurchaseOrderHeader 表以确定由某些特定雇员所下的采

购订单数。以下查询提供了此报表(按供应商排序)。

SELECT VendorID, [164] AS Emp1, [198] AS Emp2, [223] AS Emp3, [231] AS

Emp4, [233] AS Emp5

FROM

(SELECT PurchaseOrderID, EmployeeID, VendorID

FROM seOrderHeader) p

PIVOT

龙源期刊网

COUNT (PurchaseOrderID)

FOR EmployeeID IN

( [164], [198], [223], [231], [233] )

) AS pvt

ORDER BY ID;

将在 EmployeeID 列上透视此嵌套 select 语句返回的结果。

SELECT PurchaseOrderID, EmployeeID, VendorID

FROM PurchaseOrderHeader;

这意味着 EmployeeID 列返回的唯一值自行变成了最终结果集中的字段。结果,在透视子

句中指定的每个 EmployeeID 号都有相应的一列:在本例中为雇员 164、198、223、231 和

233。PurchaseOrderID 列作为值列,将根据此列对最终输出中返回的列(称为分组列)进行分

组。在本例中,通过 COUNT 函数聚合分组列。请注意,将显示一条警告消息,指出为每个雇

员计算 COUNT 时未考虑显示在 PurchaseOrderID 列中的任何空值。

3 UNPIVOT函数应用

UNPIVOT 将与 PIVOT 执行几乎完全相反的操作,将列转换为行。假设以上示例中生成的

表在数据库中存储为 pvt,并且您需要将列标识符 Emp1、Emp2、Emp3、Emp4 和 Emp5 旋转

为对应于特定供应商的行值。这意味着必须标识另外两个列。包含要旋转的列值(Emp1、

)的列将被称为 Employee,将保存当前位于待旋转列下的值的列被称为 Orders。这些

列分别对应于 Transact-SQL 定义中的 pivot_column 和 value_column。

参考文献

[1] 杜佰林.网络数据库SQL Server 2000[M].清华出版社,2009.

[2] 何薇,舒后.网络数据库技术与应用[M].清华大学出版社,2014.