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.


发布评论