当前位置: 首页 > 编程日记 > 正文

SQL Server 2008中的Pivot和UnPivot

SQL Server 2008中SQL应用系列--目录索引

今天给新成员讲解PIVOT 和 UNPIVOT示例,顺便整理了一下其用法。这是自SQL Server 2005起提供的新功能。

官方示例:http://msdn.microsoft.com/zh-cn/library/ms177410%28v=sql.105%29.aspx

首先看PIVOT示例:

基本表数据:

View Code
IF NOT OBJECT_ID('tb_Income') IS NULL
DROP TABLE [tb_Income]

/****** Object: Table [dbo].[tb_Income] Script Date: 2012/4/5 8:19:21 ******/


CREATE TABLE [dbo].[tb_Income](
----[PKID] int primary key identity(101,1),
[PName] [Nvarchar](20) NOT NULL,
[CYear] Smallint NOT NULL,
[CMonth] TinyInt NOT NULL,
[CMoney] Decimal (10,2) Not Null

)

GO
INSERT [dbo].[tb_Income]
SELECT '胡一刀',2011,2,5600
union ALL SELECT '胡一刀',2011,1,5678
union ALL SELECT '胡一刀',2011,3,6798
union ALL SELECT '胡一刀',2011,4,7800
union ALL SELECT '胡一刀',2011,5,8899
union ALL SELECT '胡一刀',2011,8,8877
union ALL SELECT '胡一刀',2011,6,7788
union ALL SELECT '胡一刀',2011,7,6798
union ALL SELECT '胡一刀',2011,10,10000
union ALL SELECT '胡一刀',2011,9,12021
union ALL SELECT '胡一刀',2011,11,8799
union ALL SELECT '胡一刀',2011,12,10002

union ALL SELECT '苗人凤',2011,1,3455
union ALL SELECT '苗人凤',2011,2,4567
union ALL SELECT '苗人凤',2011,3,5676
union ALL SELECT '苗人凤',2011,4,5600
union ALL SELECT '苗人凤',2011,5,6788
union ALL SELECT '苗人凤',2011,6,5679
union ALL SELECT '苗人凤',2011,7,6785
union ALL SELECT '苗人凤',2011,8,7896
union ALL SELECT '苗人凤',2011,9,7890
union ALL SELECT '苗人凤',2011,10,7799
union ALL SELECT '苗人凤',2011,11,9988

union ALL SELECT '郑希来',2011,2,5600
union ALL SELECT '郑希来',2011,3,2345
union ALL SELECT '郑希来',2011,5,12000
union ALL SELECT '郑希来',2011,4,23456
union ALL SELECT '郑希来',2011,6,4567
union ALL SELECT '郑希来',2011,7,6789
union ALL SELECT '郑希来',2011,8,9998
union ALL SELECT '郑希来',2011,9,34567
union ALL SELECT '郑希来',2011,12,5609

GO

测试结果如下:

SELECT * FROM tb_Income
GO

/*

PName CYear CMonth CMoney
胡一刀 2011 2 5600.00
胡一刀 2011 1 5678.00
胡一刀 2011 3 6798.00
胡一刀 2011 4 7800.00
胡一刀 2011 5 8899.00
胡一刀 2011 8 8877.00
胡一刀 2011 6 7788.00
胡一刀 2011 7 6798.00
胡一刀 2011 10 10000.00
胡一刀 2011 9 12021.00
胡一刀 2011 11 8799.00
胡一刀 2011 12 10002.00
苗人凤 2011 1 3455.00
苗人凤 2011 2 4567.00
苗人凤 2011 3 5676.00
苗人凤 2011 4 5600.00
苗人凤 2011 5 6788.00
苗人凤 2011 6 5679.00
苗人凤 2011 7 6785.00
苗人凤 2011 8 7896.00
苗人凤 2011 9 7890.00
苗人凤 2011 10 7799.00
苗人凤 2011 11 9988.00
郑希来 2011 2 5600.00
郑希来 2011 3 2345.00
郑希来 2011 5 12000.00
郑希来 2011 4 23456.00
郑希来 2011 6 4567.00
郑希来 2011 7 6789.00
郑希来 2011 8 9998.00
郑希来 2011 9 34567.00
郑希来 2011 12 5609.00
*/

现在需要统计2011年的个人总工资,使用Group by 即可:

SELECT PName,sum(Cmoney) as YearMoney from tb_Income
GROUP BY PName
ORDER BY sum(Cmoney) desc

/*
PName YearMoney
郑希来 104931.00
胡一刀 99060.00
苗人凤 72123.00
*/


现在我们来进行行列转换:

SELECT CYear,胡一刀,苗人凤,郑希来 FROM tb_Income 
PIVOT(sum(CMoney)
FOR PName IN
(胡一刀,苗人凤,郑希来)) t

/*
CYear 胡一刀 苗人凤 郑希来
2011 5678.00 3455.00 NULL
2011 5600.00 4567.00 5600.00
2011 6798.00 5676.00 2345.00
2011 7800.00 5600.00 23456.00
2011 8899.00 6788.00 12000.00
2011 7788.00 5679.00 4567.00
2011 6798.00 6785.00 6789.00
2011 8877.00 7896.00 9998.00
2011 12021.00 7890.00 34567.00
2011 10000.00 7799.00 NULL
2011 8799.00 9988.00 NULL
2011 10002.00 NULL 5609.00
*/

注意行列已经转换,再汇总,关键是去除干扰列,重新构建新数据集X:

SELECT 胡一刀,苗人凤,郑希来 FROM 
(SELECT PName,CMoney FROM tb_Income) X
PIVOT(sum(CMoney)
FOR PName IN
(胡一刀,苗人凤,郑希来)) t

/*
胡一刀 苗人凤 郑希来
99060.00 72123.00 104931.00
*/

UNPIVOT的示例更简单一些:

生成基本数据:

View Code
IF NOT OBJECT_ID('tb_Tel') IS NULL
DROP TABLE [tb_Tel]

CREATE TABLE [dbo].[tb_Tel](
----[PKID] int primary key identity(101,1),
[PName] [Nvarchar](20) NOT NULL,
[Mobile1] [Nvarchar](20) NOT NULL,
[Mobile2] [Nvarchar](20) NOT NULL,
[Mobile3] [Nvarchar](20) Not Null
)
GO
INSERT [dbo].[tb_Tel]
SELECT '胡一刀','13067894562','13567889667','16767894562'
union ALL SELECT '苗人凤','1507894562','15267889667','15367894562'
union ALL SELECT '郑希来','18067894562','18567889667','18767894562'
GO

结果:

SELECT * FROM tb_Tel

/*
PName Mobile1 Mobile2 Mobile3
胡一刀 13067894562 13567889667 16767894562
苗人凤 1507894562 15267889667 15367894562
郑希来 18067894562 18567889667 18767894562
*/

行列转换:

SELECT PName,电话类型,电话号码
FROM tb_Tel
UNPIVOT(电话类型 FOR 电话号码 IN (Mobile1,Mobile2,Mobile3) ) p

/*
PName 电话类型 电话号码
胡一刀 13067894562 Mobile1
胡一刀 13567889667 Mobile2
胡一刀 16767894562 Mobile3
苗人凤 1507894562 Mobile1
苗人凤 15267889667 Mobile2
苗人凤 15367894562 Mobile3
郑希来 18067894562 Mobile1
郑希来 18567889667 Mobile2
郑希来 18767894562 Mobile3
*/



相关文章:

leetcode python 032 识别最长合法括号

# 给定一个只包含字符(和)的字符串,# 找到最长的有效(格式良好)括号子字符串的长度。# 对于“(()”,最长的有效括号子串是“()”,其长…

Android窗口管理服务WindowManagerService计算Activity窗口大小的过程分析

在Android系统中,Activity窗口的大小是由WindowManagerService服务来计算的。WindowManagerService服务会根据屏幕及其装饰区的大小来决定Activity窗口的大小。一个Activity窗口只有知道自己的大小之后,才能对它里面的UI元素进行测量、布局以及绘制。本文…

pcl需要注意的编译问题

pcl需要注意的编译问题 不要在头文件里 using namespace pcl 这会导致编译错误,而且根本分析不到错误在哪 不要在编译选项 里加 -marchnative 这个是让编译器根据你当前的cpu类型进行特定的编译优化, 例如 set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdc11 -march…

linux python版本_linux下更新Python版本并修改默认版本

linux下更新Python版本并修改默认版本,有需要的朋友可以参考下。很多情况下拿到的服务器python版本很低,需要自己动手更改默认python版本1、从官网下载python安装包(这个版本可以是任意版本3.3 2.7 2.6等等)wget http://python.org/ftp/python/2.7/Pytho…

基于HTML5的Google水下搜索

这次愚人节的时候,Google推出了水下搜索,当然,这只是一个愚人的小把戏,不过效果非常不错,进入页面后,第一眼是一个水面的效果,水下的鲨鱼在游来游去,然后Google logo和搜索框从水面上…

windows下rpc框架thrift的环境配置

windows下rpc框架thrift的环境配置 引用链接: https://www.cnblogs.com/49er/p/7193829.html 最近在弄windows下 的Facebook的rpc 框架 thrift , 网上东西看了很多, 但是大都不能一篇到位, 这里总结了一下, 也记一下自己遇到的问题和解决的方法 这里把我在实际过程中遇见的问…

CentOS 6.3 安装 samba 共享

PHP环境在linux下,但是开发的时候用的是windows,于是我用了samba将linux的一个目录共享,然后在windows上做映射,这样就可以直接在windows下编辑linux上的文件了 首先,安装samba软件,我采用的是yum安装&…

微信小程序 长按图片不出现菜单_微信更新,新功能上了热搜

微信在推出新功能方面相当克制,但每一次总能引起全网关注。昨天,微信又因为一个小功能的改进再次上了热搜,在安卓最新的 7.0.17 版本当中,微信取消了两分钟内删除功能。在新版微信中,发出的消息在两分钟内只有撤回功能…

windows下配置java环境jdk

Windows系统下搭建java的开发环境和配置环境变量 具体步骤打开链接地址:https://www.cnblogs.com/lijuntao/p/6694483.html转载于:https://www.cnblogs.com/ccw869476711/p/9401468.html

mysql 分区_搞懂MySQL分区

一.InnoDB逻辑存储结构首先要先介绍一下InnoDB逻辑存储结构和区的概念,它的所有数据都被逻辑地存放在表空间,表空间又由段,区,页组成。段段就是上图的segment区域,常见的段有数据段、索引段、回滚段等,在In…

apt Could not get lock /var/lib/dpkg/lock 解决方案

apt Could not get lock /var/lib/dpkg/lock 解决方案 删除锁定文件 sudo rm /var/lib/dpkg/lock

oracle创建DBLink连接

1.创建dblink的第一种方式,是在本地数据库tnsnames.ora文件中配置了要远程访问的数据库。tnsnames.ora文件在你安装oracle客户端安装文件里 如:(E:\oracle\product\10.2.0\db_1\NETWORK\ADMIN) 创建远程连接: INT (DESCRIPTION (ADDRES…

理解oracle中连接和会话

理解oracle中连接和会话1. 概念不同:概念不同: 连接是指物理的网络连接。 在已建立的连接上,建立客户端与oracle的会话,以后客户端与oracle的交互都在一个会话环境中进行。 2. 关系是多对多: 一个连接上可以建立0个…

ActiveMQ消息存储持久化

转https://www.cnblogs.com/xinhuaxuan/p/6128380.html https://blog.csdn.net/lr131425/article/details/68064914 为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一般都会采用持久化机制。 就是在发送者将消息发送出去后&…

python 非_Python函数的非固定参数

一、概述在原来的文章中我已经写了,位置参数和关键字参数,下面我们来谈谈默认参数和参数组二、默认参数默认参数指的是,我们在传参之前,先给参数制定一个默认的值。当我们调用函数时,默认参数是非必须传递的。默认参数…

C#关于面对象多态例子

//主的喂狗 class Program { static void Main(string[] args) { //我们来模拟一个主人养狗动物的例子 首先创建一个主人对象,同时主人买了条狗 //买来条狗,主人一喂,狗会吃东西 Person person ne…

ubuntu package XXX needs to be reinstalled,but I can't find an archive 问题修复

ubuntu package XXX needs to be reinstalled, but I can’t find an archive 修复 原文连接: https://blog.csdn.net/tbitwqb/article/details/78241101 内容: 不知道什么原因,可能是升级过程过关机或者其他什么情况导致当前问题的发生。 无论是apt…

CentOS6.2解决passwd: Authentication token manipulation error报错

passwd: Authentication token manipulation error这种错误可能有多种原因,就我了解的可能有/etc/passwd等文件i权限 今天在给学员上课的时候发现提示passwd: Authentication token manipulation error错误,我来简单描述今天的问题 [roothost4 Scripts]#…

Java核心技术第五章——2.Object类

Object类:所有类的超类 Object类是Java中所有类的始祖,在Java中每个类都是由它扩展而来的。但是并不需要这样写: public class Emloyee extends Object 如果没有明确的指出超类,Object就被认为是这个类的超类。在Java中&#xff0…

21day学通python_铁乐学python_day21_面向对象编程3

抽象类和接口类以下内容大部分摘自博客http://www.cnblogs.com/Eva-J/继承有两种用途:一:继承基类的方法,并且做出自己的改变或者扩展(代码重用)二:声明某个子类兼容于某基类,定义一个接口类Interface,接口…

系统crash无法启动 tpm error / could not read size 0x8000000e

系统crash无法启动 tpm error / couldn’t read size 0x8000000e 原文连接: https://unix.stackexchange.com/questions/305719/a-tpm-error-7-occurred-attempting-to-read-a-pcr-value-in-centos 内容: 问题: I’m getting this error while booting…

ASP.NET文件的下载

/// <summary>/// 下载文件/// </summary>/// <param name"filePath">文件的路径</param>/// <param name"fileName">文件名(有时候文件名存在数据库中用于替换路径中的文件名)</param>public void FileDownLoad(stri…

TestLink1.9.3测试用例:Excel转换XML工具一

最近在整理测试用例&#xff0c;所以想找一个合适的工具来完成对测试需求、测试用例的管理。对比了一翻&#xff0c;发现开源工具中扩展比较好的还属TestLink&#xff0c;而且还可以与JIRA进行对接&#xff0c;这样就引起了我更大的兴趣。加上之前本来就接触过此工具&#xff0…

MYSQL 使用自定义表变量

mysql 用户自定义表变量&#xff0c;ENGINEMyISAM DEFAULT CHARSETgb2312; 制定编码方式&#xff0c;防止乱码 DROP TABLE IF EXISTS p_temp; create temporary TABLE p_temp ( RowIndex int ,PRIMARY KEY (RowIndex))ENGINEMyISAM DEFAULT CHARSETgb2312; 转载于:https:/…

early EOF fatal: index-pack failed

early EOF fatal: index-pack failed 原文链接: https://stackoverflow.com/questions/21277806/fatal-early-eof-fatal-index-pack-failed 内容: First, turn off compression: git config --global core.compression 0 Next, let’s do a partial clone to truncate the a…

linux下运行python unitest_Python unittest打印日志可以在Linux上运行,但在Windows上不行...

我正在尝试编写一个unittest&#xff0c;它将stdout和stderr重定向到一个写在Windows网络驱动器上的文件。出于某些原因&#xff0c;相同的脚本(只有diff.是目录路径)可以在Linux上工作&#xff0c;但在Windows上不行。在Windows上运行时&#xff0c;不会将任何内容写入日志文件…

emacs 探索之五:latex配置

最近需要使用Latex写论文&#xff0c;之前一直在用emacs&#xff0c;而且渐渐理解emacs的思想之后发现大多数事情都能够在emacs中完成&#xff0c;那么自然会想到emacs是否能够与latex相结合。Google一下发现好多方式&#xff0c;当前前提是需要安装latex软件&#xff0c;然后e…

自动填充脚本使用及注意事项

网站开发需要&#xff0c;找了几个js脚本&#xff0c;最后选择了jQuery Autocomplete Mod&#xff08;http://www.pengoworks.com/workshop/jquery/autocomplete.htm&#xff09; 稍作修改&#xff0c;改动处见中文注释 1 jQuery.autocomplete function(input, options) {2 …

FFmpeg 与媒体文件关系

1. 容器/文件&#xff08;Container/File&#xff09;&#xff1a;即特定格式的多媒体文件&#xff0c;比如MP4&#xff0c;flv&#xff0c;mov等。 2. 媒体流&#xff08;Stream&#xff09;&#xff1a;表示在时间轴上的一段连续的数据&#xff0c;比如一段声音数据、一段视频…

一些可能没用过的调试窗口

首先说明&#xff1a;如果没有进入调试模式的话&#xff0c;默认的调试窗口如下&#xff1a; 开始前的准备&#xff1a; 新建控制台程序DebugWindowDemo&#xff1a; 修改Program.cs 的代码为&#xff1a; using System; using System.Threading; using System.Threading.Tasks…