适用于: SQL Server(所有支持的版本) Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics 并行数据仓库

可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表。 PIVOT 通过将表达式中的一个列的唯一值转换为输出中的多列,来轮替表值表达式。 PIVOT 在需要对最终输出所需的所有剩余列值执行聚合时运行聚合。 与 PIVOT 执行的操作相反,UNPIVOT 将表值表达式的列轮换为列值。

PIVOT 提供的语法比一系列复杂的 SELECT...CASE 语句中所指定的语法更简单和更具可读性。 有关 PIVOT 语法的完整说明,请参阅 FROM (Transact-SQL)。

语法

以下语法总结了如何使用 PIVOT 运算符。

复制

SELECT <non-pivoted column>,  [first pivoted column] AS <column name>,  [second pivoted column] AS <column name>,  ...  [last pivoted column] AS <column name>
FROM  (<SELECT query that produces the data>)   AS <alias for the source query>
PIVOT
(  <aggregation function>(<column being aggregated>)
FOR
[<column that contains the values that will become column headers>]   IN ( [first pivoted column], [second pivoted column],  ... [last pivoted column])
) AS <alias for the pivot table>
<optional ORDER BY clause>;

备注

UNPIVOT 子句中的列标识符需遵循目录排序规则。 对于 SQL 数据库,排序规则始终是 SQL_Latin1_General_CP1_CI_AS。 对于 SQL Server 部分包含的数据库,排序规则始终是 Latin1_General_100_CI_AS_KS_WS_SC。 如果将该列与与其他列合并,则需要 collate 子句 (COLLATE DATABASE_DEFAULT) 以避免冲突。

简单 PIVOT 示例

下面的代码示例生成一个两列四行的表。

SQL复制

USE AdventureWorks2014 ;
GO
SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost
FROM Production.Product
GROUP BY DaysToManufacture;

下面是结果集:

复制

DaysToManufacture AverageCost
----------------- -----------
0                 5.0885
1                 223.88
2                 359.1082
4                 949.4105

没有定义 DaysToManufacture 为 3 的产品。

以下代码显示相同的结果,该结果经过透视以使 DaysToManufacture 值成为列标题。 提供一个列表示三 [3] 天,即使结果为 NULL

SQL复制

-- Pivot table with one row and five columns
SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days,
[0], [1], [2], [3], [4]
FROM
(SELECT DaysToManufacture, StandardCost   FROM Production.Product) AS SourceTable
PIVOT
(
AVG(StandardCost)
FOR DaysToManufacture IN ([0], [1], [2], [3], [4])
) AS PivotTable;  

下面是结果集:

复制

Cost_Sorted_By_Production_Days 0           1           2           3           4
------------------------------ ----------- ----------- ----------- ----------- -----------
AverageCost                    5.0885      223.88      359.1082    NULL        949.4105

复杂 PIVOT 示例

若要生成交叉表报表来汇总数据,通常可能会发现 PIVOT 很有用。 例如,假设需要在 PurchaseOrderHeader 示例数据库中查询 AdventureWorks2014 表以确定由某些特定雇员所下的采购订单数。 以下查询提供了此报表(按供应商排序)。

SQL复制

USE AdventureWorks2014;
GO
SELECT VendorID, [250] AS Emp1, [251] AS Emp2, [256] AS Emp3, [257] AS Emp4, [260] AS Emp5
FROM
(SELECT PurchaseOrderID, EmployeeID, VendorID
FROM Purchasing.PurchaseOrderHeader) p
PIVOT
(
COUNT (PurchaseOrderID)
FOR EmployeeID IN
( [250], [251], [256], [257], [260] )
) AS pvt
ORDER BY pvt.VendorID;

以下为部分结果集。

复制

VendorID    Emp1        Emp2        Emp3        Emp4        Emp5
----------- ----------- ----------- ----------- ----------- -----------
1492        2           5           4           4           4
1494        2           5           4           5           4
1496        2           4           4           5           5
1498        2           5           4           4           4
1500        3           4           4           5           4

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

SQL复制

SELECT PurchaseOrderID, EmployeeID, VendorID
FROM PurchaseOrderHeader;

EmployeeID 列返回的唯一值变成了最终结果集中的字段。 因此,在 pivot 子句中指定的每个 EmployeeID 号都有对应的列:在此示例中,为员工 250251256257 和 260。 PurchaseOrderID 列作为值列,将根据此列对最终输出中返回的列(称为分组列)进行分组。 在本例中,通过 COUNT 函数聚合分组列。 请注意,系统会显示警告消息,以指明在为每个员工计算 COUNT 时,未考虑 PurchaseOrderID 列中的任何 NULL 值。

重要

如果聚合函数与 PIVOT 一起使用,则计算聚合时将不考虑出现在值列中的任何空值。

逆透视示例

与 PIVOT 执行的操作几乎相反,UNPIVOT 将列轮换为行。 假设以上示例中生成的表在数据库中存储为 pvt,并且您需要将列标识符 Emp1Emp2Emp3Emp4 和 Emp5 旋转为对应于特定供应商的行值。 因此,必须标识另外两个列。 包含要轮换的列值(Emp1Emp2...)的列称为 Employee,保留要轮换列下的现有值的列称为 Orders。 这些列分别对应于 Transact-SQL 定义中的 pivot_column 和 value_column 。 以下为该查询。

SQL复制

-- Create the table and insert values as portrayed in the previous example.
CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int,  Emp3 int, Emp4 int, Emp5 int);
GO
INSERT INTO pvt VALUES (1,4,3,5,4,4);
INSERT INTO pvt VALUES (2,4,1,5,5,5);
INSERT INTO pvt VALUES (3,4,3,5,4,4);
INSERT INTO pvt VALUES (4,4,2,5,5,4);
INSERT INTO pvt VALUES (5,5,1,5,5,5);
GO
-- Unpivot the table.
SELECT VendorID, Employee, Orders
FROM   (SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5  FROM pvt) p
UNPIVOT  (Orders FOR Employee IN   (Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt;
GO

以下为部分结果集。

复制

VendorID    Employee    Orders
----------- ----------- ------
1            Emp1       4
1            Emp2       3
1            Emp3       5
1            Emp4       4
1            Emp5       4
2            Emp1       4
2            Emp2       1
2            Emp3       5
2            Emp4       5
2            Emp5       5
...

请注意,UNPIVOT 并不完全是 PIVOT 的逆操作。 PIVOT 执行聚合,并将多个可能的行合并为输出中的一行。 UNPIVOT 不重现原始表值表达式的结果,因为行已被合并。 另外,UNPIVOT 输入中的 NULL 值也在输出中消失了。 如果值消失,表明在执行 PIVOT 操作前,输入中可能就已存在原始 NULL 值。

AdventureWorks2012 示例数据库中的 Sales.vSalesPersonSalesByFiscalYears 视图将使用 PIVOT 返回每个销售人员在每个会计年度的总销售额。 若要在 SQL Server Management Studio 中编写视图脚本,请在“对象资源管理器”中的“视图”文件夹下找到 AdventureWorks2012 数据库对应的视图 。 右键单击该视图名称,再选择“编写视图脚本为” 。

使用 PIVOT 和 UNPIVOT相关推荐

  1. SQL Server 2008中的Pivot和UnPivot

    SQL Server 2008中SQL应用系列--目录索引 今天给新成员讲解PIVOT 和 UNPIVOT示例,顺便整理了一下其用法.这是自SQL Server 2005起提供的新功能. 官方示例:h ...

  2. [SQL指令]使用 PIVOT 和 UNPIVOT,「扭转」查询的结果。

    原文出处:[SQL指令]使用 PIVOT 和 UNPIVOT,「扭转」查询的结果. http://www.dotblogs.com.tw/mis2000lab/archive/2010/12/24/m ...

  3. PIVOT 和 UNPIVOT 命令的SQL Server版本

    I:使用 PIVOT 和 UNPIVOT 命令的SQL Server版本要求 1.数据库的最低版本要求为 SQL Server 2005 或 更高 2.必须将数据库的兼容级别设置为 90 或 更高 3 ...

  4. pivot 与 unpivot 函数是SQL05新提供的2个函数

    pivot 与 unpivot 函数是SQL05新提供的2个函数   ----------------------------------------------------------------- ...

  5. oracle非常量不能用于privot_Oracle 行列转换函数pivot、unpivot的使用(二)

    一.行转列pivot 关键函数pivot,其用法如下 pivot(聚合函数 for 列名 in(类型)) select * from table_name pivot(max(column_name) ...

  6. pivot unpivot_静态和动态SQL Pivot和Unpivot关系运算符概述

    pivot unpivot In this article, we'll walk-through the SQL Pivot and SQL Unpivot operators and how th ...

  7. SQL 行转列 列转行 Oracle转置函数函数pivot、unpivot 解决wm_concat 没有排序

    https://www.cnblogs.com/mellowsmile/p/4642306.html HH 终风且暴,顾我则笑,谑浪笑敖,中心是悼. 终风且霾,惠然肯来,莫往莫来,悠悠我思. 博客园 ...

  8. PIVOT和UNPIVOT使用详解

    一.使用PIVOT和UNPIVOT命令的SQL Server版本要求 1.数据库的最低版本要求为SQL Server 2005 或更高. 2.必须将数据库的兼容级别设置为90 或更高. 3.查看我的数 ...

  9. 表横竖转换(行列转换)PIVOT 和 UNPIVOT 用法

    可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表.PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执 ...

  10. 数据透视表与mysql_通过sql做数据透视表,数据库表行列转换(pivot和Unpivot用法)(一)...

    在mssql中大家都知道可以使用pivot来统计数据,实现像excel的透视表功能 一.MSsqlserver中我们通常的用法 1.Sqlserver数据库测试 ---创建测试表 Create tab ...

最新文章

  1. 在网页中使用react
  2. 前端学习(1957)vue之电商管理系统电商系统之创建新分支
  3. hue的oozie的定时调度任务配置
  4. SpringBoot使用Mybatis教程
  5. 推荐系统实践---第一章:好的推荐系统
  6. springboot+shiro中自定义session过期时间
  7. 光储并网直流微电网控制策略及仿真模型
  8. 个人打卡签到表html代码,考勤每日签到表模板
  9. 日语开发java自我介绍,优秀日语自我介绍范文
  10. echarts柱状图的宽度
  11. 使用playsound播放音频(python)
  12. 笔记本电脑插入耳机只能外放,耳机没声音
  13. 计算机组成原理试题和答案,计算机组成原理试题(含答案)
  14. 什么是云数据库RDS?
  15. 开始尝试贝茨视觉训练法
  16. CSS(层叠样式表)知识
  17. zjfc-1108,hdu-1222 wolf and rabbits
  18. 全国民用建筑工程设计技术措施给水排水
  19. win10 bat脚本设置软件的开机自启动
  20. android怎么增量编译,阿里秒级android增量编译工具freeLine的使用入门

热门文章

  1. python中的and和or(转载)
  2. GCN频域视角相关——傅里叶变换、拉普拉斯变换、拉普拉斯算子、拉普拉斯矩阵、卷积
  3. 【BigHereo 11】-----JobReview Team Recall
  4. 哈佛成功金句-----25则
  5. 第一百支月季花(转贴)
  6. PHP开发环境搭建详细教程
  7. docker:用官方镜像在本地搭建PHP开发环境
  8. UE4大数据可视化教程(2)——通过谷歌地图创建任意一片3D地形
  9. 企业如何规划直播带货?
  10. ABAP 查询某个日期在不在财务OB52账期内