博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL之透视、逆透视及分组集
阅读量:4621 次
发布时间:2019-06-09

本文共 1186 字,大约阅读时间需要 3 分钟。

透视

假如当前有数据源如下所示:

有一报表需求如下所示:

这一类的需求就称之为数据透视转换。透视转换一般涉及分组、扩展及聚合三个阶段。上面的需求是按照empid进行分组,按照custid对订货量进行扩展,最后进行聚合SUM(qty)。数据透视转换其实是存在某种通用查询模板的。下面是上面这个需求的标准SQL解决方案:

1 SELECT empid,2   SUM(CASE WHEN custid = 'A' THEN qty END) AS A,3   SUM(CASE WHEN custid = 'B' THEN qty END) AS B,4   SUM(CASE WHEN custid = 'C' THEN qty END) AS C,5   SUM(CASE WHEN custid = 'D' THEN qty END) AS D  6 FROM dbo.Orders7 GROUP BY empid;

下面是使用T-SQL PIVOT运算符进行透视转换:

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

注意,一般不直接把PIVOT运算符应用到源数据表(本例为Orders表),而是将其应用到一个表表达式(该表表达式只包含透视转换需要的3种元素,不包含其他属性)。

逆透视

标准SQL的解决方案:

1 SELECT * 2 FROM (SELECT empid, custid, 3         CASE custid 4           WHEN 'A' THEN A 5           WHEN 'B' THEN B 6           WHEN 'C' THEN C 7           WHEN 'D' THEN D     8         END AS qty 9       FROM dbo.EmpCustOrders10         CROSS JOIN (VALUES('A'),('B'),('C'),('D')) AS Custs(custid)) AS D11 WHERE qty IS NOT NULL;

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

1 SELECT empid, custid, qty2 FROM dbo.EmpCustOrders3   UNPIVOT(qty FOR custid IN(A, B, C, D)) AS U;

 

转载于:https://www.cnblogs.com/laixiancai/p/4352614.html

你可能感兴趣的文章
分布式事务解决方案(一) 2阶段提交 & 3阶段提交 & TCC
查看>>
android之网格布局和线性布局实现注册页面
查看>>
BZOJ 1014: [JSOI2008]火星人prefix( splay + hash )
查看>>
安装ejabberd2并配置MySQL为其数据库
查看>>
angular repeat
查看>>
android 图片圆角化控件
查看>>
java第三次作业
查看>>
HP Jack介绍
查看>>
敏捷软件开发(3)---COMMAND 模式 & Active Object 模式
查看>>
poj 1062 昂贵的聘礼 解题报告
查看>>
get the page name from url
查看>>
visual studio中csproj文件中的project guid改为小写 ( notepad++ 正则)
查看>>
TeeChart显示三维的图形,使用Surface
查看>>
如何使用 Idea 远程调试 Java 代码
查看>>
加密,解密
查看>>
在C#代码中应用Log4Net(一)简单使用Log4Net
查看>>
[转]如何写软件项目技术标
查看>>
每日站立会议个人博客五
查看>>
ddd
查看>>
死磕 java同步系列之AQS起篇
查看>>