SQL SERVER技术内幕之7 透视与逆透视

1.透视转换

透视数据(pivoting)是一种把数据从行的状态旋转为列的状态的处理,在这个过程中可能须要对值进行聚合。

每个透视转换将涉及三个逻辑处理阶段,每个阶段都有相关的元素:分组阶段处理相关的分组或行元素,扩展(spreading)阶段处理相关的扩展或列元素,聚合阶段处理相关的聚合元素和聚合函数。例子中的分组元素是empid,扩展元素为custid,聚合函数为SUM(),聚合元素为qty。

(1)使用标准SQL进行透视转换

SELECT empid,
SUM(CASE WHEN custid = ‘A’ THEN qty END) AS A,
SUM(CASE WHEN custid = ‘B’ THEN qty END) AS B,
SUM(CASE WHEN custid = ‘C’ THEN qty END) AS C,
SUM(CASE WHEN custid = ‘D’ THEN qty END) AS D
 FROM dbo.Orders GROUP BY empid

(2)使用T-SQL PIVOT运算符进行透视转换

SELECT empid,A,B,C,D
FROM(SELECT empid,custid,qty
         FROM dbo.Orders ) AS D
PIVOT(SUM(qty) FOR custid IN(A,B,C,D)) AS P

PIVOT 运算符隐式地把源表(或表表达式)中既没有指定为扩展元素,也没有指定为聚合元素的那些元素作为分组元素,所以在使用PIVOT运算符时,须要保证PIVOT运算符的源表除了分组、扩展和聚合元素以外,不能再包含其他属性。

2.逆透视转换

逆透视转换是一种把数据从列的状态旋转为行的状态的技术。

现在要求逆透视转换数据,为每个雇员和客户组合返回一行记录,其中包含这一组合的订货量,期望的输出结果应该如下所示:

(1)使用标准SQL进行逆透视转换
标准SQL解决方案非常明确地要实现3个逻辑处理阶段:生成副本、提取元素和删除不相关的交叉。

...解决方案的第一步是根据来源表的每一行生成多个副本,在这个例子,需要为A、B、C、D 4个列分别生成一个副本

SELECT *
FROM dbo.EmpCustOrders
CROSS JOIN(VALUES(‘A‘),(‘B‘),(‘C‘),(‘D‘)) AS Custs(custid);

实现解决方案的第一步操作后,返回以下输出结果:

...第二步是生成一个数据列,由它返回与当前副本所代表的客户相对应的列值。具体到本例而言,如果当前custid的值为A,则qty列应该返回A列的值,如果当前custid的值为B,则qty列应该返回B列的值。

实现解决方案的第二步之后,生成以下输出结果:

...第三步删除不相关的交叉

(2)使用T-SQL的UNPIVOT运算符进行逆透视转换

SELECT empid,custid,qty
FROM dbo.EmpCustOrders
UNPIVOT(qty FOR custid IN(A,B,C,D)) AS U;                                                             
时间: 2024-07-30 10:19:01

SQL SERVER技术内幕之7 透视与逆透视的相关文章

SQL Server技术内幕笔记合集

SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnblogs.com/lyhabc/articles/3914213.html Microsoft SQL Server 2005技术内幕:T-SQL查询笔记http://www.cnblogs.com/lyhabc/articles/3912608.html Microsoft SQL Server 2

SQL SERVER技术内幕之3 联接查询

JOIN表运算符对两个输入表进行操作.联接有三种基本类型:交叉联接.内联接和外联接.这三种联接的区别是它们采用的逻辑查询处理步骤各不相同,每种联接都有一套不同的步骤.交叉联接只有一个步骤----笛卡尔积;内联接有两个步骤----笛卡尔积.过滤;外联接有三个步骤----笛卡尔积.过滤.添加外部行. 3.1 交叉联接 SQL SERVER支持交叉联接的两种标准语法:ANSI SQL-92和ANSI SQL-89,推荐使用SQL-92的语法. 3.1.1 ANSI SQL-92语法 SELECT C.

SQL SERVER技术内幕之5 表表达式

表表达式是一种命名的查询表达式,代表一个有效的关系表.可以像其他表一样,在数据处理语句中使用表表达式.SQL Server支持4种类型的表表达式:派生表(derived table).公用表表达式(CTE,common table expression).视图以及内联表值函数(inline TVF,inline table-valued function). 表表达式并不是物理上真实存在的什么对象,它们是虚拟的.对于表表达式的查询在数据库引擎内部都将转换为对底层对象的查询.使用表表达式的好处通常

SQL SERVER技术内幕之6 集合查询

1.定义 集合运算会对两个输入查询的结果集进行逐行比较,根据比较结果和所使用的集合运算来确定某一行是否应该包含在集合运算的结果中.因为集合运算是针对集合之间进行的计算,所以集合运算涉及的两个查询不能包含Order By子句.包含Order By子句的查询可以确保结果的排列顺序,因此,这样的查询返回的不是集合,而是游标. ANSI SQL对每种集合运算都支持两个选项:DISTINCT(默认值)和ALL,DISTINCT逻辑上可以从两个输入的多集中消除重复的行,然后返回一个集合.ALL对两个多集进行

SQL SERVER技术内幕之4 子查询

最外层查询的结果集会返回给调用者,称为外部查询.内部查询的结果是供外部查询使用的,也称为子查询.子查询可以分成独立子查询和相关子查询两类.独立子查询不依赖于它所属的外部查询,而相关子查询则须依赖它所属的外部查询.子查询的期望值可以是单值的.多值的或以表为值. 1.独立子查询 独立子查询是独立于其外部查询的子查询.在逻辑上,独立子查询在执行外部查询之前只要先执行一次,接着外部查询再使用子查询的结果继续进行查询. 1.1 独立标量子查询 标量子查询是返回单个值的子查询,标量子查询可以出现在外部查询中

SQL Server 技术讨论专用 QQ 群

强烈推荐 SQL Server 技术讨论专用 QQ 群 QQ 群号: 213291913 注意事项: 本QQ群仅限于交流 SQL Server 技术,请勿灌水,否则直接踢人. 进群后请将群昵称改为实名,便于大家交流,群昵称格式为:地区-姓名. 听从指挥.文明交流.快乐学习.

SQL点滴19—T-SQL中的透视和逆透视

原文:SQL点滴19-T-SQL中的透视和逆透视 透视 今天抽一点时间来看看透视和逆透视语句,简单的说就是行列转换.假设一个销售表中存放着产品号,产品折扣,产品价格三个列,每一种产品号可能有多种折扣,每一种折扣只对应一个产品价格.下面贴出建表语句和插入数据语句. 1 create table SalesOrderDetail( 2 ProductID int /*unique多谢wuu00的提醒*/, 3 UnitPriceDiscount float, 4 ProductPrice float

笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-07 透视、逆透视及分组集

透视转换 透视数据是一种把数据从行的状态旋转为列的状态的处理.每个透视转换将涉及分组.扩展及聚合三个逻辑处理阶段,每个阶段都有相关的元素:分组阶段处理相关的分组或行元素,扩展阶段处理相关的扩展或列元素,聚合阶段处理相关的聚合元素和聚合函数.现在假设有一张表数据如下: 我现在需要查询出下面的结果: 需求分析:需要在结果中为每一个雇员生成一行记录,这就需要对Orders表中的行按照其empid列进行分组:从结果看,还需要为每一个客户生成一个不同的结果列,那么扩展元素就是custid列:最后还需要对数

SQL之透视、逆透视及分组集

透视 假如当前有数据源如下所示: 有一报表需求如下所示: 这一类的需求就称之为数据透视转换.透视转换一般涉及分组.扩展及聚合三个阶段.上面的需求是按照empid进行分组,按照custid对订货量进行扩展,最后进行聚合SUM(qty).数据透视转换其实是存在某种通用查询模板的.下面是上面这个需求的标准SQL解决方案: 1 SELECT empid, 2 SUM(CASE WHEN custid = 'A' THEN qty END) AS A, 3 SUM(CASE WHEN custid = '