T-SQL Part IX, PIVOT and UNPIVOT
不同于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相反但原理完全一致的操作。
然而,有两个问题比较困扰我:
- 如何执行动态的PIVOT?比如,示例中的IN()部分都是写死的,现实中显然这种固定值的情况不多。搜索了一圈下来,答案几乎全都是手动拼接IN后面的字符串。有一篇Blog值得一看。
- 这个功能在现实中的意义?貌似这个没有标准答案。无论如何,行列互转总是个噱头。
是为之记。
Alva Chien
2016.6.14
T-SQL Part IX, PIVOT and UNPIVOT的更多相关文章
- sql行列转换PIVOT与unPIVOT
基本语法 select * from Mould pivot ( count(ID)for ProductTypeCode in ( [FC], [RCU], [RCD] )) as PVT; wit ...
- SQL Server 使用 Pivot 和 UnPivot 实现行列转换
对于行列转换的数据,通常也就是在做报表的时候用的比较多,之前也零零散散的看了一些,今天就来总结一下. 先创建一个用于演示的临时表: create table #temp ( 年份 ) null, 月份 ...
- SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子
使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UN ...
- 通过sql做数据透视表,数据库表行列转换(pivot和Unpivot用法)(一)
在mssql中大家都知道可以使用pivot来统计数据,实现像excel的透视表功能 一.MSsqlserver中我们通常的用法 1.Sqlserver数据库测试 ---创建测试表 Create tab ...
- sql pivot、unpivot和partition by用法
原文:sql pivot.unpivot和partition by用法 演示脚本 from sys.sysobjects where name = 'Student' AND type = 'U') ...
- SQL Server 行列相互转换命令:PIVOT和UNPIVOT使用详解
一.使用PIVOT和UNPIVOT命令的SQL Server版本要求 1.数据库的最低版本要求为SQL Server 2005 或更高. 2.必须将数据库的兼容级别设置为90 或更高. 3.查看我的数 ...
- PIVOT 和 UNPIVOT 命令的SQL Server版本
I:使用 PIVOT 和 UNPIVOT 命令的SQL Server版本要求 1.数据库的最低版本要求为 SQL Server 2005 或 更高 2.必须将数据库的兼容级别设置为 90 或 更高 3 ...
- [转]Oracle SQL函数pivot、unpivot转置函数实现行转列、列转行
原文地址:http://blog.csdn.net/seandba/article/details/72730657 函数PIVOT.UNPIVOT转置函数实现行转列.列转行,效果如下图所示: 1.P ...
- Pivot 和 Unpivot
在TSQL中,使用Pivot和Unpivot运算符将一个关系表转换成另外一个关系表,两个命令实现的操作是“相反”的,但是,pivot之后,不能通过unpivot将数据还原.这两个运算符的操作数比较复杂 ...
随机推荐
- STM32串口IAP分享
什么是IAP? IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通 ...
- netty源码解解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk
PoolArena实现了用于高效分配和释放内存,并尽可能减少内存碎片的内存池,这个内存管理实现使用PageRun/PoolSubpage算法.分析代码之前,先熟悉一些重要的概念: page: 页,一个 ...
- Unity 场景中看不到物体或者OnDrawGizmos画的线看不到
有时候,Unity中的场景里面,物体突然看不见了,可以这样做: 首先,在 Hierarchy 面板选择看不见的物体,按下快捷键 f.如果物体还是看不见,见下图: 看看图中圈红的地方.如果,如果 ...
- PHP current
1.函数的作用:返回数组的当前元素 2.函数的参数: @params array &$array 3.例子: <?php $arr = [null,'PK',false]; : ; ec ...
- Ubuntu中用户名密码和root密码修改
用户名密码和root密码不是同一个密码 重置(修改)root密码 ubuntu的root初始密码是随机的,每次开机都有一个新的root密码修改方法如下: 1.sudo passwd root 2.此处 ...
- day1-01 温度转换
一."温度转换"问题分析 1.1 温度转换 温度刻画的两种不同体系 摄氏度:中国等世界大多数国家使用 以1标准大气压下水的结冰点为0度,沸点为100度,将温度进行等分刻画 华氏度: ...
- 【朝花夕拾】跨进程通信,你只知道AIDL,就OUT了
一.前言 提起跨进程通信,大多数人首先会想到AIDL.我们知道,用AIDL来实现跨进程通信,需要在客户端和服务端都添加上aidl文件,并在服务端的Service中实现aidl对应的接口.如果还需要服务 ...
- 开发架构+osi七层协议+socket(day26)
目录 软件开发架构 C/S架构 B/S架构 网络编程 互联网协议/OSI七层协议 传输层 网络层 数据链路层 物理连接层 socket 什么是socket 为什么用socket 如何使用 软件开发架构 ...
- vue 列表的排序过渡 shuffle遇到的问题
内部的实现,Vue 使用了一个叫 FLIP 简单的动画队列使用 transforms 将元素从之前的位置平滑过渡新的位置 需要注意的是使用 FLIP 过渡的元素不能设置为 display: inlin ...
- Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException 异常
Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException 报此异常是应为有相同的bean ...