sql-pivot
PIVOT
PIVOT运算符用于在列和行之间进行数据旋转或透视转换,同时执行聚合运算
Select * From Sales.OrderValues Where YEAR(orderdate) In(2006,2007,2008) Order By empid asc
Select * From
(
Select empid,YEAR(orderdate) As OrderYear,val From Sales.OrderValues
) OV Pivot(Sum(val) For OrderYear In([],[],[])) P
返回每个雇员每年处理过的订单的总价格。在输出中,每个雇员占一行,每个订单年份占一列,每个雇员行和订单年份列的交叉位置上则是总价格。
PIVOT运算符用一个名为OV的表表达式作为它的左输入:每个订单占一行,包含雇员ID(empid)、订单年份(orderyear)和订单价格(val)。PIVOT操作涉及以下三个步骤:
1、P1:分组
2、P2:扩展
3、P3:聚合
从查询语句中看到PIVOT运算符引用了OV中的两个列作为输入参数(val和orderyear)。第一阶段会隐式地对OV的行进行分组,分组依据是那些未作为PIVOT输入的所有列,就像是有一个隐藏的Group By子句。在这个示例中只有empid列没有出现在PIVOT的输入参数中。所以每个雇员都将有一个组。
注意:
PIVOT的隐式分组阶段并不会影响查询中任何显式的GROUP BY子句。PIVOT运算最终会生成一个虚拟表,作为下一个逻辑阶段(也许是另一个表运算,也许是WHERE阶段)的输入。当查询中同时出现PIVOT和GROUP BY时,会有两个单独的分组阶段:一个是PIVOT的第一个阶段(P1),另一个是查询的GROUP BY阶段。
PIVOT的第二个阶段(P2)将<spreading_col>列表中的值扩展到它们相应的目标列上。在逻辑上,相当于为IN子句中指定的每个目标列使用一下CASE表达式:
CASE WHEN <spereading_col> = <target_col_element> THEN <expression> END
在这个例子中相当于应用了下面3个表达式:
CASE WHEN orderyear = 2006 THEN val END,
CASE WHEN orderyear = 2007 THEN val END,
CASE WHEN orderyear = 2008 THEN val END
注意:不带ELSE子句的CASE表达式相当于包含一个隐式的 ELSE NULL
对于每个目标列,只有来源行具有相应的订单年份时,CASE 表达式才会返回订单价格(val列),否则,CASE 表达式将返回 NULL
PIVOT 的第三个阶段(P3)对每个 CASE 表达式应用指定的聚合函数,该例中逻辑上等效的表达式应该是这样:
SUM(CASE WHEN orderyear = 2006 THEN val END) AS [2006],
SUM(CASE WHEN orderyear = 2007 THEN val END) AS [2007],
SUM(CASE WHEN orderyear = 2008 THEN val END) AS [2008]
前面的 PIVOT 查询逻辑上相当于以下查询:
Select empid,
SUM(CASE WHEN orderyear=2006 THEN val END) AS [],
SUM(CASE WHEN orderyear=2007 THEN val END) AS [],
SUM(CASE WHEN orderyear=2008 THEN val END) AS []
FROM (
SELECT empid,YEAR(orderdate) AS orderyear,val FROM Sales.OrderValues
) AS OV
GROUP BY empid
sql-pivot的更多相关文章
- sql pivot、unpivot和partition by用法
原文:sql pivot.unpivot和partition by用法 演示脚本 from sys.sysobjects where name = 'Student' AND type = 'U') ...
- SQL pivot 基本用法 行列转换 数据透视
SQL通过pivot进行行列转换 数据透视 可直接在sql server 运行 传统操作 和 pivot create table XKCl (name nchar(10) not null, 学科 ...
- Ms sql pivot unpivot
--建表 create table dbo.orders ( orderid int not null primary key nonclustered, orderdate datetime not ...
- sql pivot(行转列) 和unpivot(列转行)的用法
1.PIVOT用法(行转列) select * from Table_Score as a pivot (sum(score) for a.name in ([语文],[数学],[外语],[文综],[ ...
- MS SQL PIVOT数据透视表
以前曾经做过练习<T-SQL PIVOT 行列转换>https://www.cnblogs.com/insus/archive/2011/03/05/1971446.html 今天把拿出来 ...
- MSSQL—行转列
行转列,是SQL中经常会遇到的一个问题,并且分为静态转换和动态转换,所谓静态转换即在转换的行数已知或固定:动态转换则为转换的行数不固定. 转换的方法一般采用case when语句或pivot(MSSQ ...
- oracle琐碎笔记
Oracle知识点 ps:由于是自己看的所以笔记比较乱,大家谅解 Commit rollback Sql核心语句之select Selct中要用到以下语句 From语句 Where语句 Group b ...
- MSSQL—行转列
行转列,是SQL中经常会遇到的一个问题,并且分为静态转换和动态转换,所谓静态转换即在转换的行数已知或固定:动态转换则为转换的行数不固定. 转换的方法一般采用case when语句或pivot(MSSQ ...
- MSSQL行车列规则
行转列,是SQL中经常会遇到的一个问题,并且分为静态转换和动态转换,所谓静态转换即在转换的行数已知或固定:动态转换则为转换的行数不固定. 转换的方法一般采用case when语句或pivot(MSSQ ...
- SQL Server中行列转换 Pivot UnPivot
SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...
随机推荐
- 架构师养成记--29.redis开篇
主要有从下几点讲解 NOSQL(Redis) 简介.redis安装与部署 Redis基础事件类型详解 Redis高级命令 Redis与java的使用 Redis集群搭建 Redis集群与spring的 ...
- 【JavaScript】动态原型模式创建对象 ||为何不能用字面量创建原型对象?
var proto = ""; function Person(name, age, job) { this.name = name; this.age = age; this.j ...
- PHPStudy环境下搭建composer
第一种方法(亲测有效) 1. 找到composer的安装目录:D:\phpstudy\PHPTutorial\tools\composer 2.把目录下的 composer.bat 和 compose ...
- 关于 maven 打包直接运行的 fat jar (uber jar) 时需要包含本地文件系统第三方 jar 文件的问题
关于maven打包fat jar (uber jar) 时需要包含本地文件系统第三方jar文件的问题,今天折腾了一整天.最后还是用了spring boot来做.下面是几篇关于打包的有参考价值的文章,以 ...
- Cisco ASA 8.3前及8.3后版本Access-list 变化
8.2及之前 access-list:源地址是真实IP地址,目的地址是映射地址packet-tracer:源地址为真实IP地址,目的地址为映射地址 8.3及之后access-list:源地址和目的地址 ...
- Dalvik与JVM区别
1.Dalvik出现和SDK层面采用java为开发语言的原因 1.1 避免Native作为应用代码导致的因为设备多样化导致App生态了支离破碎,是从Nokia哪里的教训. 1.2 重新实现Dalvik ...
- android开发之提高应用启动速度_splash页面瞬间响应_避免APP启动闪白屏
Application和Activity中的onCreate都进行了优化,基本没有耗时操作,但是启动应用之后还是会闪现一下白色背景,然后才进入Splash页面,对比了一下QQ.微信.微博等客户端,点击 ...
- 关于禁止html缓存
在现代的浏览器里,为了增强用户体验,浏览器一般都会把网页上所需的静态文件缓存到本地,再次刷新的时候则无需再重新加载,但是我们有时候就是不需要浏览器缓存这些文件,而是每次都从服务器端读取数据,可以用以下 ...
- redis数据类型(五)set类型
一. set类型 set是无序集合,最大可以包含(2 的 32 次方-1)个元素. set 的是通过 hash table 实现的,所以添加,删除,查找的复杂度都是 O(1). hash table ...
- vue之生命周期的一点总结
vue的生命周期的过程提供了我们执行自定义逻辑的机会,好好理解它的生命周期,对我们很有帮助. 一.vue实例的生命周期(vue2.0) 二.生命周期描述:(参考截图) 三.例子 window.vm = ...