透视转换:

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. codeforces 604A Uncowed Forces

    题目链接:http://codeforces.com/problemset/problem/604/A 题意:求cf比赛每次能够增加的排名,运算规则会告诉你 题目分类:数学 题目分析:用题目给的公式直 ...

  2. 事件总线帧---Otto

    我们如果这样一种业务场景.如今在做一款及时聊天应用,我们在聊天页面进行收发信息.同一时候也要实时更新前一页面的聊天记录,这时我们该怎样去实现?说说我曾经的实现策略.我使用的是广播接收器BroadCas ...

  3. The tempfile module

    The tempfile module The tempfile module This module allows you to quickly come up with unique names ...

  4. Powershell Mail module, 发送outbox 里的全部邮件(一个.csv文件代表一封邮件)

    把creating mail代码写到调用处,往outbox写入 mailxxx.csv文件,入面记录了邮件的主要内容 写入 #template $TMP = IMPORT-CSV "$($d ...

  5. ImportError: No module named _sqlite3 - 代码分享

    ImportError: No module named _sqlite3 - 代码分享 ImportError: No module named _sqlite3 作者:86市场网       点击 ...

  6. RCP开发中错误:java.lang.RuntimeException: WARNING: Prevented recursive attempt to activate part...

    在做RCP的eclipse插件开发时,启动管理软件界面时,总是报如下错误 : !ENTRY org.eclipse.ui.workbench 4 0 2012-05-25 18:44:21.306 ! ...

  7. hdu4956 Poor Hanamichi

    解决暴力的直接方法.一个直接的推论x%11方法. 打表可以发现,以解决不同的情况都不会在很大程度上会出现. 所以从l暴力开始枚举.找到的第一个错误值输出要. 如果它超过r同样在美国发现-1. #inc ...

  8. RabbitMQ消息队列应用

    RabbitMQ消息队列应用 消息通信组件Net分布式系统的核心中间件之一,应用与系统高并发,各个组件之间解耦的依赖的场景.本框架采用消息队列中间件主要应用于两方面:一是解决部分高并发的业务处理:二是 ...

  9. 服务器编程入门(1)TCP/IP协议族

    问题聚焦: 简单地梳理一下TCP/IP各层的功能和常用协议 详细了解ARP(数据链路层)和DNS(应用层)协议的工作原理 1 TCP/IP协议族体系结构 数据链路层:     职责:实现网卡接口的网络 ...

  10. hosts文件导致无法访问网站

    前段时间有人反映无论怎么样都无法在自己的电脑上访问法兰克官网,那台电脑的DNS也无法解析,通过查看hosts文件后发现,原来该电脑的hosts文件木马修改过了,屏蔽了相关的域名,删除新增的或者用其他机 ...