透视转换:

use tempdb;
if object_id('dbo.Orders', 'U') is not null drop table dbo.Orders;
create table dbo.Orders
(
orderid int not null,
orderdate date not null,
empid int not null,
custid varchar(5) not null,
aty int not null,
constraint pk_Orders primary key(orderid)
);
insert into dbo.Orders(orderid, orderdate, empid, custid, qty)
values
(300001, '20070802', 3, 'A', 10),
(100001, '20071224', 2, 'A', 12),
(100005, '20071224', 1, 'B', 20),
(400001, '20080109', 2, 'A', 40),
(100006, '20080118', 1, 'C', 14),
(200001, '20080212', 2, 'B', 12),
(400005, '20090212', 3, 'A', 10),
(200002, '20090216', 1, 'C', 20),
(300003, '20090418', 2, 'B', 15),
(300004, '20070418', 3, 'C', 22),
(300007, '20090907', 3, 'D', 30);
SELECT * FROM dbo.Orders;

select empid, custid, sum(qty) as sumqty
from dbo.Orders
group by empid, custid;

empid A B C D
1 NULL 20 34 NULL
2 52 27 NULL NULL
3 20 NULL 22 30

T-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;

T-SQL Pivot解决方案

select empid, A, B, C, D
from (select empid, custid, qty from dbo.Orders) as O
pivot(sum(qty) for custid in(A, B, C, D)) as P;

select custid, [1], [2], [3]
from (select empid, custid, qty from dbo.Orders) as O
pivot(sum(qty) for empid in ([1], [2], [3])) as P;

逆透视转换:

if object_id('dbo.EmpCustOrders', 'U') is not null drop table dbo.EmpCustOrders;

select empid, A, B, C, D
into dbo.EmpCustOrders
from (select empid, custid, qty from dbo.Orders) as O
pivot(sum(qty) for custid in(A, B, C, D)) as P;

使用标准T-SQL进行逆透视转换
非常明确的需要实现三个逻辑处理阶段:生成副本,提取元素和删除不相关的交叉。
select * from dbo.EmpCustOrders
cross join (values('A'),('B'),('C'),('D')) as Custs(custid);

select * from dbo.EmpCustOrders
cross join (select 'A' as custid
        union all select 'B',
        union all select 'C',
        union all select 'D') as Custs;

select empid, custid, (case custid
            when 'A' then A
            when 'B' then B
            when 'C' then C
            when 'D' then D end) as qty
from dbo.EmpCustOrders
cross join (values('A'),('B'),('C'),('D')) as Custs(custid);

select * from (select empid, custid, (case custid
            when 'A' then A
            when 'B' then B
            when 'C' then C
            when 'D' then D end) as qty
from dbo.EmpCustOrders
cross join (values('A'),('B'),('C'),('D')) as Custs(custid)) as O
where qty is not null;

T-SQL unpivot解决方案
select empid, custid, qty
from dbo.EmpCustOrders
unpivot(qty for custid in (A, B, C, D)) as U;

分组集:

select empid, custid, sum(qty) as sumqty
from dbo.Orders
group by empid, custid
union all
select empid, null, sum(qty) as sumqty
from dbo.Orders
group by empid
union all
select null, custid, sum(qty) as sumqty
from dbo.Orders
group by custid
union all
select null, null, sum(qty) as sumqty
from dbo.Orders

使用分组集(grouping sets, cube and rollup)
select empid, custid, sum(qty) as sumqty
from dbo.Orders
group by grouping sets
(
    (empid, custid),
    (empid),
    (custid),
    ()
);

select empid, custid, sum(qty) as sumqty
from dbo.Orders
group by cube(empid, custid);

select empid, custid, sum(qty) as sumqty
from dbo.Orders
group by empid, custid
with cube;

cube(a, b, c)生成3个输入成员得到的8个可能的分组集;而rollup只生成4个分组集,相当于指定了grouping sets((a,b,c), (a,b), (a), ());
select year(orderdate) as orderyear,
    month(orderdate) as ordermonth,
    day(orderdate) as orderday,
    sum(qty) as sumqty
from dbo.Orders
group by rollup(year(orderdate), month(orderdate), day(orderdate));

select year(orderdate) as orderyear,
    month(orderdate) as ordermonth,
    day(orderdate) as orderday,
    sum(qty) as sumqty
from dbo.Orders
group by year(orderdate), month(orderdate), day(orderdate)
with rollup;

T-SQL基础(7) - 透视,逆透视和分组集的更多相关文章

  1. sql基础语法复习(二)-- 分组,连接的使用

    一.深入学习  group by group by ,分组,顾名思义,把数据按什么来分组,每一组都有什么特点. 1.我们先从最简单的开始: select count(*) from tb1 group ...

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

    原文:SQL点滴19-T-SQL中的透视和逆透视 透视 今天抽一点时间来看看透视和逆透视语句,简单的说就是行列转换.假设一个销售表中存放着产品号,产品折扣,产品价格三个列,每一种产品号可能有多种折扣, ...

  3. SQL Server进阶(八)查询——开窗函数、四大排名函数、透视数据、逆透视数据

    概述 ROW_NUMBER() OVER(PARTITION BY CustId ORDER BY ID DESC) https://www.jb51.net/article/75533.htm 开窗 ...

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

    1.透视转换 透视数据(pivoting)是一种把数据从行的状态旋转为列的状态的处理,在这个过程中可能须要对值进行聚合. 每个透视转换将涉及三个逻辑处理阶段,每个阶段都有相关的元素:分组阶段处理相关的 ...

  5. PIVOT(透视转换)和UNPIVOT(逆透视转换)

    一.原数据状态 二.手动写透视转换1 三.手动写透视转换2 四.PIVOT(透视转换)和UNPIVOT(逆透视转换)详细使用 使用标准SQL进行透视转换和逆视转换 --行列转换 create tabl ...

  6. T-SQL——数据透视和逆透视

    目录 0. 测试数据集及说明 0.1 准备测试数据 0.2 对一维表和二维表理解 1. 透视转换 1.1 使用标准SQL进行数据透视 1.2 使用T-SQL中pivot函数进行数据透视 1.3 关于 ...

  7. UNPIVOT逆透视以及动态逆透视存储过程

    前几天一直练习PIVOT透视,还实现了动态透视的存过程<动态透视表>https://www.cnblogs.com/insus/p/10888277.html 今天练习MS SQL Ser ...

  8. 《BI那点儿事》数据流转换——逆透视转换

    逆透视转换将来自单个记录中多个列的值扩展为单个列中具有同样值的多个记录,使得非规范的数据集成为较规范的版本.例如,每个客户在列出客户名的数据集中各占一行,在该行的各列中显示购买的产品和数量.逆透视转换 ...

  9. T-SQL中的透视和逆透视

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

随机推荐

  1. 从Hadoop骨架MapReduce在海量数据处理模式(包括淘宝技术架构)

    从hadoop框架与MapReduce模式中谈海量数据处理 前言 几周前,当我最初听到,以致后来初次接触Hadoop与MapReduce这两个东西,我便稍显兴奋,认为它们非常是神奇.而神奇的东西常能勾 ...

  2. SQL视图索引

    视图: 视图就相当于一个查询结果,它相对应的是表 表----真正存储数据的地方 视图---不存储数据,展示查询的结果 注意: 1.视图就是为了查询数据方便.一般不要试图向视图中插入数据,容易出错. 2 ...

  3. codeforces584B Kolya and Tanya

    题目链接:http://codeforces.com/problemset/problem/584/B 解题思路:当n=1时,_______    _______   ______  三个数每位上可以 ...

  4. scala 函数编程

     scala 函数编程  Effective Scala.pdf: http://www.t00y.com/file/76767869 Functional_Programming_in_Scal ...

  5. object-c编程tips-timer

    object-c定时器 object-c定时器会自己主动retain当前的使用者,假设不注意调用invalidate,则非常easy引起循环引用导致内存泄露.以下的思路提供了一套还算可行的解决方式. ...

  6. python基础教程_学习笔记10:异常

    异常 什么是异常 Python用异常对象来表示异常情况.遇到错误后,会引发异常.假设异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止运行: >>> ...

  7. JavaScript 中的闭包和作用域链(读书笔记)

    要想理解闭包,应当先理解JavaScript的作用域和作用域链. JavaScript有一个特性被称之为“声明提前(hoisting)”,即JavaScript函数里声明的所有变量(但不涉及赋值)都被 ...

  8. storm-编程入门

    一 编程接口                                           watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbm ...

  9. Laravel 中国 - 巨匠级PHP开发框架 Laravel 中国社区

    http://m.baidu.com/from=844b/bd_page_type=1/ssid=0/uid=3151E6C0905477A13653132D762BB6FB/pu=sz%401320 ...

  10. 在Windows下使用Hexo+GithubPage搭建博客的过程

    1.安装Node.js 下载地址:传送门 去 node.js 官网下载相应版本,进行安装即可. 可以通过node -v的命令来测试NodeJS是否安装成功 2.安装Git 下载地址:传送门 去 Git ...