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

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

   

透视

今天抽一点时间来看看透视和逆透视语句,简单的说就是行列转换。假设一个销售表中存放着产品号,产品折扣,产品价格三个列,每一种产品号可能有多种折扣,每一种折扣只对应一个产品价格。下面贴出建表语句和插入数据语句。

1 create table SalesOrderDetail(
2 ProductID int /*unique多谢wuu00的提醒*/,
3 UnitPriceDiscount float,
4 ProductPrice float
5 )
6  insert into SalesOrderDetail values
7 (711,.00,12),
8 (711,.00,13),
9 (711,.02,17),
10 (711,.02,16),
11 (711,.05,19),
12 (711,.05,20),
13 (711,.10,21),
14 (711,.10,22),
15 (711,.15,23),
16 (711,.15,24),
17 (747,.00,41),
18 (747,.00,42),
19 (747,.02,45),
20 (747,.02,46),
21 (776,.20,50),
22 (776,.20,49),
23 (776,.35,52),
24 (776,.35,53)

首先来看一条查询语句

1 select ProductID,UnitPriceDiscount,SUM(ProductPrice) as SumPrice
2  from SalesOrderDetail
3  group by ProductID,UnitPriceDiscount
4 order by ProductID,UnitPriceDiscount

这条语句查询每一种产品针对每一种折扣的价钱总和,查询结果如下图1

2011070717051170.png

图1

  

从图中我们可以看出771号产品有4种折扣,747号产品有2种折扣,776号产品有2种折扣。现在如果我们想知道每一种产品折扣,每一种产品的销售总价是多少,如下图2

2011070717060618.png

图2

  

如图对于折扣0,产品711的总价是25,对以折扣0.02,产品711的总价是33等等不再列举。原来的行是产品号,现在产品号变成了列,原来的折扣变成了现在的第一列。这就是数据透视的效果。下面我们开看看是这个效果是如何用语句实现的。

1 select * from
2 (select sod.ProductPrice,sod.ProductID,sod.UnitPriceDiscount from SalesOrderDetail sod) so
3 pivot
4 (
5 sum(so.ProductPrice) for so.ProductID in([711],[747],[776])
6 ) as pt
7 order by UnitPriceDiscount

  

首选创建子查询(select sod.ProductPrice,sod.ProductID,sod.UnitPriceDiscount from SalesOrderDetail sod) so ,透视运算符要使用这个子查询中的数据进行聚合运算,此外输出显示也要用到子查询中的列。代码生成一个别名为so的表值表达式。在这个表中使用pivot在特定的列上进行聚合,这里是对so.ProductPrice进行聚合,聚合针对so.ProductID进行。在这个例子中对三种产品的中的每一种创建一个列。这个相当于group by,从so表达式中进行数据筛选。不过这里没有选出ProductPrice,仅仅生成每行三个列,每一种产品为一个列的结果集。因此带有povit的表值表达式生成一个临时的结果集,将这个结果集命名为pt,使用这个结果集生成我们需要的输出。如果想要得到一个更加合适的列名可以修改筛选条件。如下:

1 select pt.UnitPriceDiscount,[711] as Product711,[747] as Product747,[776] as Product747 from
2 (select sod.ProductPrice,sod.ProductID,sod.UnitPriceDiscount from SalesOrderDetail sod) so
3 pivot
4 (
5 sum(so.ProductPrice) for so.ProductID in([711],[747],[776])
6 ) as pt
7 order by UnitPriceDiscount

  

输出的结果如下图3

2011070717072861.png

图3

  

逆透视

这次我们首先看语句和查询结果再分析,语句如下:

  

1 select ProductID,UnitPriceDiscount,ProductPrice
2 from
3 (select UnitPriceDiscount,Product711,Product747,Product776 from #Temp1) as up1
4 unpivot(ProductPrice for ProductID in(Product711,Product747,Product776)) as up2
5 order by ProductID

查询结果如下图4:

2011070717094153.png

图4



首先我们来看看逆透视得到了一个什么样的结果。对于每一种产品的每一种折扣查询得到他们的合计售价,这个和上面图1中的结果是一样的,是的,它和透视之前的结果是相同的。逆透视和透视并不是完全相反。Pivot会执行聚合,把可能存在的多个行合并输出得到一行。由于已经进行了合并,unpivot无法重新生成原始的表值表达式,unpivot输入中的null值将在输出中消失,尽管在pivot操作之前输入中可能存在原始的null值。如图5是他们的比较。在图中我们可以看到NULL值下面一个图中没有NULL值,刚好有9行。下图把他们放在一起比较。

 

2011070717110320.png

图5

下面我们来剖析一下上面的语句到底做了些什么。首先是一个表值函数(select UnitPriceDiscount,Product711,Product747,Product776 from #Temp1) as up1,这个表值函数从透视结果,也就是临时表中,然后针对每一个产品号进行逆透视:unpivot(ProductPrice for ProductID in(Product711,Product747,Product776)) as up2,然后从逆透视结果中选择ProductID ,ProductPrice,从表值函数中选择UnitPriceDiscount。

延伸阅读

一个例子还不足以让我们理解这个语句,下面来看看TechNet中的例子。

SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost FROM Production.Product

GROUP BY DaysToManufacture;

这个语句查出Product表中的制造时间和平均成本,得到如下的结果

2011070717141110.png

图6

如图可以看到没有制造时间为3天的产品,这里留下一个伏笔,在透视之后会出现一个NULL值。下面使用透视语句对它进行行列转换,就是使用0,1,2,3来作为列,使用具体的制造成本作为行数据。语句如下

 

1 select
2 'AverageCost' as Cost_Sorted_By_Production_Days,
3 [0],[1],[3],[4]
4 from
5 (select DaysToManufacture,StandardCost from Production.Product) as SourceTable
6 pivot
7 (avg(StandardCost) for DaysToManufacture in ([0],[1],[3],[4])) as PivotTable

依旧,首先用一个表值表达式把要透视的列和透视的项选择出来,然后使用透视语句针对每一个项计算平均成本,最后从这个透视结果中选择出结果。
结果如下图7,我们可以看到制造时间为3天的产品没有一个对应的平均成本。
2011070717153793.png

图7

 

下面这个例子稍微复杂一点。

1 SELECT VendorID,count(PurchaseOrderID) as PurchaseCunt
2 FROM Purchasing.PurchaseOrderHeader group by VendorID

这条语句查询得到每个供应商和他对应的交易号的个数,也就是每个供应商成交的交易次数。如图8列举出部分结果

2011070717165031.png

图8

从图中我们可以看到供应商1共成交51比交易,供应商2共成交51笔交易。如果我们想查出这些交易分别是和那些雇员成交的应该怎么写呢?首先我们来看看表中全部的雇员情况。

select distinct(EmployeeID) from Purchasing.PurchaseOrderHeader

查询结果如图9

2011070717181944.png

图9

如上图我们可以看到共有12个雇员有成交记录。对于这些雇员,如下查询语句

 

1 SELECT
2 VendorID,
3 [164] AS Emp164,
4 [198] AS Emp198,
5 [223] AS Emp223,
6 [231] AS Emp231,
7 [233] AS Emp233,
8 [238] as Emp238,
9 [241] as Emp241,
10 [244] as Emp244,
11 [261] as Emp261,
12 [264] as Emp264,
13 [266] as Emp266,
14 [274] as Emp274
15 FROM
16 (SELECT PurchaseOrderID,EmployeeID,VendorID
17 FROM Purchasing.PurchaseOrderHeader) p
18 PIVOT
19 (
20 COUNT (PurchaseOrderID)
21 FOR EmployeeID IN
22 ( [164], [198], [223], [231],[233],[238],[241],[244],[261],[264],[266],[274])
23 ) AS pvt
24 ORDER BY pvt.VendorID;

查询结果如下图10

2011070717192856.png

图10

可以 简单地计算一下1+4+3+5+4+4+4+5+5+4+5+6+2刚好等于51,分开来看就是1号供应商分别和164号雇员成交4比记录,和198号雇员成交3比记录等等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Magicodes.IE 2.5.5.3发布

2.5.5.32021.08.27修复Append方式导出多个sheet时,发生“Tablename is not unique”错误,具体见#299。2.5.5.22021.08.24添加对Abp模块的包装,具体见#318。Magicodes.IE.Excel.Abp(MagicodesIEExcelModule)注册IExcelE…

C语言阿斯码,木叶四位上忍设定各不相同,网红负责秀操作,她只需要美就够了...

原标题:木叶四位上忍设定各不相同,网红负责秀操作,她只需要美就够了木叶四位上忍设定各不相同,网红负责秀操作,她只需要美就够了说道忍界网红,那一定就是卡卡西了。卡卡西在《火影》当中的表现俘获了大批小…

80岁COBOL码农:扶我起来,这个bug我会修!

95%的 ATM 交易通过 COBOL 程序,80%的现场交易依赖于它们,超过 40%的银行仍然使用 COBOL 作为其系统的基础。由于年轻人懂 COBOL 的比较少,美国康涅狄格州劳工部正在召回经验丰富的退休 COBOL 人员。来源&a…

小心使用宏

开发过程中,会经常使用宏定义,偶尔还会碰到重复定义的宏,有些时候会造成不良影响。 见如下例子: Test.h #ifndef GUARD_TEST_H #define GUARD_TEST_H class CTest { public: CTest(); virtual ~CTest(); void Display(void); publ…

DMZ区

DMZ是英文“demilitarized zone”的缩写,中文名称为“隔离区”,也称“非军事化区”。它是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间的缓冲区,这个缓冲区位于企业内部网络和…

果园机器人是什么文体_果园机器人课文原文

秋天到了,果农们又高兴又发愁。高兴的是水果又丰收啦,发愁的是需要做的事太多了。要把果子从树上摘下来,要把它们运到很远的地方去卖,实在忙不过来。你会想,可以让机器人来帮忙呀。是的,现在已经有了会干农…

json_encode ajaxReturn getJSON

之前我在页面中getJSON("") $.getJSON("/index.php/Shopcar/getspcar",function(data){ spcars.splistdata; console.log(data); }); 在访问的方法中这样写的 $this->scres $sc->query($sql); $data json_encode($this->scres); $this->aja…

数据资产纳入国资保值增值考核

首先是国资云近期横空出世,国资云的推广预示着党政及国企未来将坚持私有云技术路线。从天津、四川等省市国资云平台的建设方式来看,未来党政及国企部门的业务系统上云将坚持私有云的技术路线,由此可能对未来国内云计算市场带来深远影响。国资…

python实例编程_python 编程实例 5

#题目:输入三个整数 x,y,z,请把这三个数由小到大输出。 #1.程序分析:我们想办法把最小的数放到 x 上,先将 x 与 y 进行比较,如果 x>y 则将 x 与 y #的值交换,再比较X 和Z比较。 x int(input("输入…

iPhone5:4G是否进入主流的风向标?

当业内的目光不约而同地集中到苹果即将发布的iPad2的时候,按照惯例,苹果的另一款重量级产品iPhone5也会在今年登场。近日,国外有预测称,苹果的iPhone5可能会不支持 4G网络,这多少令业内感到意外和失望,并由…

linux phpunit 安装,PHPUnit安装教程

使用PHPUnit的第一步就是安装PHPUnit。1 准备条件1.1 PHPUnit版本选择最新版PHPUnit并不能在所有的PHP环境下使用。例如,PHPUnit 6.4 不能在PHP 5.4 环境下使用,否则会出错。对应版本支持如下:PHPUnit 6.0~6.4:PHP7.0PHPUnit 5.0~…

一滴水从高处落下来,会不会砸死人?

全世界只有3.14 % 的人关注了爆炸吧知识有一个相当古老的段子是这么说的:为了涨姿势,我加入一个物理博士群,见到有人问:一滴水从很高的地方落下来,会不会弄死人?群里一下就热闹起来,各种公式&am…

python检验阿姆斯特朗数_python 之九九乘法表,润年,奇偶数,阿姆斯特朗数判断分享...

九九乘法表&#xff1a;for i in range(1, 10):for j in range(1, i 1):print(j, "x", i, "", i * j, end" ")print()i 1while i < 10:j 1while j < i:print(j, "x", i, "", i * j, end" ")j 1print()p…

给ubuntu换个图标主题(icon theme)

2019独角兽企业重金招聘Python工程师标准>>> 对于linux mint&#xff0c; http://linuxmint-art.org/?xcontentmode8325给出了很多icon主题。 安装方法有下面几种&#xff1a; 1、使用PPA 2、将解压后的icon主题目录放到 /usr/share/icons目录下。 3、将解压后的i…

Cisco系列网络设备测试命令大全

1、show命令&#xff1a; 1&#xff09; 全局命令&#xff1a;show version &#xff1b;显示系统硬件和软件版本、DRAM、Flashshow startup-config &#xff1b;显示写入NVRAM中的配置内容show running-config &#xff1b;显示当前运行的配置内容show buffers &#xff1b;详…

贴图程序进展

从2.28号到现在&#xff0c;在休息&#xff0c;在此先整理下之前的情况&#xff0c;对问题和要做的内容进行一下梳理。 首先&#xff0c;把之前的问题稍做下总结&#xff0c;上次提到OpenGL版本这块&#xff0c;我的是1.1版本&#xff0c;所以就只能用顶点数组来实现了&#xf…

unity 坐标系转换_Unity的几种坐标系及相互转换

介绍1.WorldSpace(世界坐标系)当我们向场景中添加物体时&#xff0c;他们都是以世界坐标系的方式的方式显示在场景中的通过transform.position可以得到它在世界中的坐标位置&#xff0c;transform.position(Vector3)可以设置它在世界中的位置(c#不支持单独设置x y z)&#xff1…

get到一个生气后的牵手方式!太可爱了

1 公司新聘的出纳&#xff0c;大家看看尽不尽职&#xff1f;2 柯基&#xff1a;腿长有啥用啊3 男友力爆表的小螃蟹4 一滴水的下落&#xff0c;原来如此有条有理5 内容太过真实6 get到一个生气后的牵手方式7 你们那里的这条街叫什么&#xff1f;你点的每个赞&#xff0c;我都认真…

python flask框架是什么_Flask框架是什么?带你安装运行第一个Flask程序

1 了解框架 Flask作为Web框架&#xff0c;它的作用主要是为了开发Web应用程序。那么我们首先来了解下Web应用程序。Web应用程序 (World Wide Web)诞生最初的目的&#xff0c;是为了利用互联网交流工作文档。 1.1 一切从客户端发起请求开始。 所有Flask程序都必须创建一个程序实…

还在做互联网创业梦?醒醒!

阅读本文大概需要7分钟。最近国家在互联网领域动作不少&#xff1a;在线教育K12领域被全面整治、阿里被罚款182亿、巨头的垄断和无序扩张遭遇严格限制&#xff0c;大部分互联网上市公司股价一泻千里。身边不少大佬原本身价几千万的期权股票&#xff0c;一瞬间近乎清零&#xff…