Pivot应用

/*
《Microsoft SQL Server 2008 T-SQL Fundamentals (PRO-Developer)》
《Microsoft SQL Server 2012 T-SQL Fundamentals》
*/ if object_id('dbo.orders','U') is not null drop table dbo.orders;
GO
CREATE TABLE dbo.Orders
(
orderid INT NOT NULL,
orderdate DATE NOT NULL,
empid INT NOT NULL,
custid VARCHAR(5) NOT NULL,
qty INT NOT NULL,
CONSTRAINT PK_Orders PRIMARY KEY(orderid)
);
GO
INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)
VALUES
(30001, '', 3, 'A', 10),
(10001, '', 2, 'A', 12),
(10005, '', 1, 'B', 20),
(40001, '', 2, 'A', 40),
(10006, '', 1, 'C', 14),
(20001, '', 2, 'B', 12),
(40005, '', 3, 'A', 10),
(20002, '', 1, 'C', 20),
(30003, '', 2, 'B', 15),
(30004, '', 3, 'C', 22),
(30007, '', 3, 'D', 30); select * from orders select empid,custid,sum(qty) as SumQty
from dbo.Orders
group by empid,custid
-----------------------------------------------------------------
--
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
-----------------------------------------------------------------
--
SELECT empid --,orderid,orderdate,
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 orderid, orderdate, empid;
-----------------------------------------------------------------
--3 使用PIVOT操作符转置
--PIVOT语法(此处还是将语法摆在此处,以形成一个理论形式):
select ...
from (SourceTable or TableExpression)
pivot (<agg_func>(<aggregation_element>)) for <spreading_element> in (<list_of_targe_columns>) as <result_table_alias> 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
-----------------------------------------------------------------
--
SELECT empid, A, B, C, D
FROM dbo.Orders
PIVOT(SUM(qty) FOR custid IN(A, B, C, D)) AS P;
-----------------------------------------------------------------
--
SELECT custid, [], [], []
FROM (SELECT empid, custid, qty
FROM dbo.Orders) AS D
PIVOT(SUM(qty) FOR empid IN([], [], [])) AS P;
----------------------------------------------------------------- -----------------------------------------------------------------

I strongly recommend that you never operate on the base table directly, even when the table contains only columns used as pivoting elements.
You never know whether new columns will be added to the table in the future, rendering your queries incorrect.
I recommend considering the use of a table expression as the input table to the PIVOT operator as if it were part of the requirement of the operator's syntax.

--1                         -3              --5
                        

--2                         --4
                 
_____________上面是PIVOT的训练------------------------

--------------------下面是UNPIVOT的训练,与PIVOT放在一起便于对比理解--------------------

----------UNPIVOT的应用 (Jun 3,增补)
--就将PIVOT的结果集,当做UNPIVOT训练的源表,由此可产生出一个新表来以作为我们的“源”训练
--我们要做的其实就是将 PIVOT的结果集旋转过来 if object_id('EmpCustOrders','U') is not null drop EmpCustOrders;
select empid,A,B,C,D
into EmpCustOrders
from (select empid,custid,qty
from Orders) as F
PIVOT (sum(qty) for custid in(A,B,C,D)) as p; select * from EmpCustOrders ----------EmpCustOrders,现在就是我们操作的对象了
-----------------------------------------------------------------
--第1步
--1 (MSSQL2008, we can use a table value constructor in the form of values clause)
select *
from EmpCustOrders
cross join (values('A'),('B'),('C'),('D')) AS Custs(custid);
----------
--1.1 (before MSSQL2008, we need substitute the values clauses withe a series of select statements)
select *
from EmpCustOrders
cross join (select 'A' as custid
union all select 'B'
union all select 'C'
union all select 'D') as CustsABC;
-----------------------------------------------------------------
--第2步
--
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 EmpCustOrders
cross join (values('A'),('B'),('C'),('D')) AS Custs(custid)
--第3步(在第2步的基础上,去除那些 null 的数据),此步骤已经实现了旋转后的结果
--
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 EmpCustOrders
cross join (values('A'),('B'),('C'),('D')) AS Custs(custid)
) as p
where qty is not null; --既然学习UNPIVOT,就用此法实现
--UNPIVOT语法
-PIVOT语法(此处还是将语法摆在此处,以形成一个理论形式):
--3.1
select ...
from (SourceTable or TableExpression)
unpivot <target_col_to_hold_source_col_values> --->>>unpivot里面的参数不要进行聚合计算
for <target_col_to_hold_source_col_names> in (<list_of_source_columns>) as <result_table_alias> -- select empid,custid,qty
from EmpCustOrders
unpivot(qty for custid in(A,B,C,D)) as p; --

-- 我们将 PIVOT的结果集( 参考PIVOT的运行结果 --5),生成了一个新表,
--select * from EmpCustOrders

--1                                                                     --2                                   --3                                    --3.1(UNPIVOT方式)
                                    

PIVOT | UNPIVOT_1的更多相关文章

  1. Pivot 和 Unpivot

    在TSQL中,使用Pivot和Unpivot运算符将一个关系表转换成另外一个关系表,两个命令实现的操作是“相反”的,但是,pivot之后,不能通过unpivot将数据还原.这两个运算符的操作数比较复杂 ...

  2. SQL Server中行列转换 Pivot UnPivot

    SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...

  3. Open xml 操作Excel 透视表(Pivot table)-- 实现Excel多语言报表

    我的一个ERP项目中,客户希望使用Excel Pivot table 做分析报表. ERP 从数据库中读出数据,导出到Excel中的数据源表(统一命名为Data),刷新Pivot table! 客户还 ...

  4. SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子

    使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UN ...

  5. T-SQL Recipes之Dynamic PIVOT and UNPIVOT

    PIVOT PIVOT在行转列的时候经常用到,最便捷的方式就是通过示例来理解它的作用. 示例1 Query to Return Select Product Data from AdventureWo ...

  6. sql的行转列(PIVOT)与列转行(UNPIVOT)

    在做数据统计的时候,行转列,列转行是经常碰到的问题.case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比较快速实现行转列,列转行,而且可扩展性强 一.行转列 1.测 ...

  7. Panorama和Pivot的区别

    Panorama 1.提供了更丰富的用户体验(建议最多4个Items项) 2.Item可以设置屏幕方向为水平,支持多于一个屏幕的显示 3.可以使用任意大小的背景图片,Panorama会自动地缩放为屏幕 ...

  8. 如何用Pivot实现行列转换

    在Oracle中,如果要实现行列转换,较为常见的是用DECODE和CASE语句.对于简单的行列转行,DECODE和CASE语句尚能应付.在逻辑比较复杂,分组聚合较多的场景中,DECODE和CASE语句 ...

  9. SQL Server SQL性能优化之--pivot行列转换减少扫描计数优化查询语句

    原文出处:http://www.cnblogs.com/wy123/p/5933734.html 先看常用的一种表结构设计方式: 那么可能会遇到一种典型的查询方式,主子表关联,查询子表中的某些(或者全 ...

随机推荐

  1. strut2登陆注册验证码

    1. 生成图片和验证码 package com.jmu.code; import java.awt.Color; import java.awt.Font; import java.awt.Graph ...

  2. 两圆相交求面积 hdu5120

    转载 两圆相交分如下集中情况:相离.相切.相交.包含. 设两圆圆心分别是O1和O2,半径分别是r1和r2,设d为两圆心距离.又因为两圆有大有小,我们设较小的圆是O1. 相离相切的面积为零,代码如下: ...

  3. JavaScript实现单向链表结构

    参考资料 一.什么是链表结构? 1.1.简介 链表和数组一样, 可以用于存储一系列的元素, 但是链表和数组的实现机制完全不同,链表中的元素在内存不是连续的空间,链表的每个元素由一个存储元素本身(数据) ...

  4. .NET Core HttpClient源码探究

    前言     在之前的文章我们介绍过HttpClient相关的服务发现,确实HttpClient是目前.NET Core进行Http网络编程的的主要手段.在之前的介绍中也看到了,我们使用了一个很重要的 ...

  5. 【Windows】win10:硬件良好,软件系统出错

    平台:戴尔G3, win10 现象:能正常开机,开机后前几分钟内能打开部分应用,经过大约两分钟后系统无法正常使用. 分析:此次问题出现再新购买的笔记本电脑中,鉴于电脑刚买,硬件坏的可能性很小,然而为了 ...

  6. Chisel3 - util - OneHot

    https://mp.weixin.qq.com/s/Jsy8P3m9W2EYKwneGVekiw   独热码相关的电路生成器.   参考链接: https://github.com/freechip ...

  7. Linux内存管理—详细讲解

    摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法.力求从外到内.水到渠成地引导网友分析Linux的内存管理与使用.在 ...

  8. Java实现第八届蓝桥杯兴趣小组

    兴趣小组 为丰富同学们的业余文化生活,某高校学生会创办了3个兴趣小组 (以下称A组,B组,C组). 每个小组的学生名单分别在[A.txt],[B.txt]和[C.txt]中. 每个文件中存储的是学生的 ...

  9. Linux帮助命令man详解

    命令man详解 命令man,可以获得命令(使用whatis命令可以得到一个命令的简短介绍,可以使用:命令 --help 来获得命令的选项说明)或配置文件的帮助信息(可以使用apropos命令仅查看配置 ...

  10. Python学习之斐波那契数列实现篇

    描述 一个斐波那契序列,F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) (n>=2),根据n的值,计算斐波那契数F(n),其中0≤n≤1000. 输入 输入 ...