不同于CROSS JOIN, CROSS APPLY, OUTER APPLY,MSDN文档对PIVOT和UNPIVOT 想得重视了一点,单独做了一个页面来介绍。
简单来说,PIVOT用来把行转成列,而UNPIVOT可以把列转成行。

用MSDN文档给出的两个例子来做说明。
例一,基础示例。

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

例二,复杂示例。

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

第一步,也是所有SELECT语句的第一步,弄清楚Source Table,即FROM后面的源table
对于例一:

(SELECT DaysToManufacture, StandardCost
FROM Production.Product) AS SourceTable

对于例二:

(SELECT PurchaseOrderID, EmployeeID, VendorID
FROM Purchasing.PurchaseOrderHeader) p

第二步,理解PIVOT的作用域
对于例一,即针对DaysToManufacture在IN范畴中的每个值计算AVG(StandardCost)

(
AVG(StandardCost)
FOR DaysToManufacture IN ([], [], [], [], [])
)

对于例二,即针对EmployID在IN范畴中的每一个值计算COUNT (PurchaseOrderID):

(
COUNT (PurchaseOrderID)
FOR EmployeeID IN
( [], [], [], [], [] )
)

事实上,可以用等价的SQL来实现PIVOT。以下两段SQL是等价的:

SELECT empid, [], [], []
FROM ( SELECT empid, YEAR(orderdate) AS orderyear, val
FROM Sales.OrderValues ) AS D
PIVOT( SUM(val) FOR orderyear IN([],[],[]) ) AS P;
SELECT empid,
SUM(CASE WHEN orderyear = 2013 THEN val END) AS [],
SUM(CASE WHEN orderyear = 2014 THEN val END) AS [],
SUM(CASE WHEN orderyear = 2015 THEN val END) AS []
FROM ( SELECT empid, YEAR(orderdate) AS orderyear, val
FROM Sales.OrderValues ) AS D
GROUP BY empid;

UNPIVOT执行的是PIVOT相反但原理完全一致的操作。

然而,有两个问题比较困扰我:

  1. 如何执行动态的PIVOT?比如,示例中的IN()部分都是写死的,现实中显然这种固定值的情况不多。搜索了一圈下来,答案几乎全都是手动拼接IN后面的字符串。有一篇Blog值得一看。
  2. 这个功能在现实中的意义?貌似这个没有标准答案。无论如何,行列互转总是个噱头。

是为之记。
Alva Chien
2016.6.14

T-SQL Part IX, PIVOT and UNPIVOT的更多相关文章

  1. sql行列转换PIVOT与unPIVOT

    基本语法 select * from Mould pivot ( count(ID)for ProductTypeCode in ( [FC], [RCU], [RCD] )) as PVT; wit ...

  2. SQL Server 使用 Pivot 和 UnPivot 实现行列转换

    对于行列转换的数据,通常也就是在做报表的时候用的比较多,之前也零零散散的看了一些,今天就来总结一下. 先创建一个用于演示的临时表: create table #temp ( 年份 ) null, 月份 ...

  3. SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子

    使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UN ...

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

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

  5. sql pivot、unpivot和partition by用法

    原文:sql pivot.unpivot和partition by用法 演示脚本 from sys.sysobjects where name = 'Student' AND type = 'U') ...

  6. SQL Server 行列相互转换命令:PIVOT和UNPIVOT使用详解

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

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

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

  8. [转]Oracle SQL函数pivot、unpivot转置函数实现行转列、列转行

    原文地址:http://blog.csdn.net/seandba/article/details/72730657 函数PIVOT.UNPIVOT转置函数实现行转列.列转行,效果如下图所示: 1.P ...

  9. Pivot 和 Unpivot

    在TSQL中,使用Pivot和Unpivot运算符将一个关系表转换成另外一个关系表,两个命令实现的操作是“相反”的,但是,pivot之后,不能通过unpivot将数据还原.这两个运算符的操作数比较复杂 ...

随机推荐

  1. [BZOJ1116] CLO

    1116: [POI2008]CLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1311  Solved: 709[Submit][Status] ...

  2. React+Antd+Antd-Img-Crop实现上传固定大小的裁剪头像或者图片(且可控制图片数量)

    见章知著 1024,程序员们节日快乐!本文主要讲述react配合antd以及react-img-crop第三方库实现一个可控的图片上传功能. 运行项目 需要具有node环境 第三方库安装 1.antd ...

  3. nginx::升级到最新nginx

    ubuntu16. 升级nginx到最新版本 wget http://nginx.org/keys/nginx_signing.key sudo apt-key add nginx_signing.k ...

  4. python- = 与 ==的区别

    一个等号代表的含义是赋值,将某一数值赋给某个变量,比如a=3,将3这个数值赋予给a. 两个等号是判断是否相等,返回True或False,比如1==1.他们是相等的,那么就返回true.1==2,他们是 ...

  5. Typora忘记保存的文件怎么找回

    打开Typora,选择文件--偏好设置,在通用设置下点击恢复未保存的草稿,就可以找到你所有未保存的文件.

  6. 关于Java 项目的思考总结

    Java 项目思考总结 前言 今天是2017年3月25日,笔者已经毕业半年,工作经验一年. 正好有心思写这个总结. 持续开发 对于Java项目,我所接触的一般就是JavaWeb项目和 Java Jar ...

  7. 面对对象高阶+反射+魔法方法+单例(day22)

    目录 昨日内容 组合 封装 property装饰器 多态 鸭子类型 今日内容 classmethod staticmethod 面对对象高级 isinstance issubclass 反射(重要) ...

  8. Mysql数据库(七)触发器

    一.MySQL触发器 触发器是由MySQL的基本命令事件来触发某种特定操作,这些基本的命令由INSERT.UPDATE.DELETE等事件来触发某些特定操作.满足触发器的触发条件时,数据库系统就会自动 ...

  9. Mysql数据库(三)Mysql表结构管理

    一.MySQL数据类型 1.数字类型 (1)整数数据类型包括TINYINT/BIT/BOOL/SMALLINT/MEDIUMINT/INT/BIGINT (2)浮点数据类型包括FLOAT/DOUBLE ...

  10. Java基础(十六)断言(Assertions)

    1.断言的概念 假设确信某个属性符合要求,并且代码的执行依赖于这个属性. 断言机制允许在测试期间向代码插入一些检查语句,当代码发布时,这些插入的检查语句将会被自动地移走. 断言失败是致命的,不可恢复的 ...