惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The GitHub Blog
The GitHub Blog
S
SegmentFault 最新的问题
MyScale Blog
MyScale Blog
有赞技术团队
有赞技术团队
V
Visual Studio Blog
T
The Blog of Author Tim Ferriss
爱范儿
爱范儿
Vercel News
Vercel News
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Y
Y Combinator Blog
Blog — PlanetScale
Blog — PlanetScale
D
DataBreaches.Net
美团技术团队
Microsoft Security Blog
Microsoft Security Blog
大猫的无限游戏
大猫的无限游戏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
酷 壳 – CoolShell
酷 壳 – CoolShell
GbyAI
GbyAI
A
About on SuperTechFans
云风的 BLOG
云风的 BLOG
The Cloudflare Blog
宝玉的分享
宝玉的分享
V
V2EX
Microsoft Azure Blog
Microsoft Azure Blog

博客园 - CrazyWill

VBscript(ASP)计算程序运行时间,精度到毫秒 VBscript(ASP)常用函数 301永久重定向实现方式及302重定向 开源搜索引擎资源 18种方法让你集中精力工作 IE的BUG - CrazyWill - 博客园 弱智的卡巴死机 bash比较文件时间和当前时间 - CrazyWill - 博客园 老问题: SQL server 2000安装过程中错误解决 使用TELNET手工操作 IMAP 查看邮件 安装 samba 记录 使用TELNET手工操作 SMTP/POP 收发邮件 世界 Web 2.0 网站评奖揭晓 MagicAjax使用简介 [链接]什么是Web 2.0——下一代软件的设计模式和商业模式 SQL语句实现合并数据(原创) SQL语句实现横排 WEB页面统一认证登录方法 一道有趣的C#考试题目
SQL语句实现横排 2
CrazyWill · 2006-04-14 · via 博客园 - CrazyWill

前一篇文章 SQL语句实现横排 介绍了在SQL SERVER 2000中实现数据横排的功能,这篇介绍在最新的SQLSERVER 2005中的实现方法。

SQL SERVER 2005中新增加了两个关系运算符 PIVOT/ UNPIVOT,能够实现表中的列转换到行,以及行到列的转换工作。

举例,还是先创建测试数据表

CREATE TABLE sales.salesByMonth
(
year char(4),
month char(3),
amount 
money,
PRIMARY KEY (yearmonth)
)

INSERT INTO sales.salesByMonth (yearmonth, amount)
VALUES('2004','Jan'789.0000)
INSERT INTO sales.salesByMonth (yearmonth, amount)
VALUES('2004','Feb'389.0000)
INSERT INTO sales.salesByMonth (yearmonth, amount)
VALUES('2004','Mar'8867.0000)
INSERT INTO sales.salesByMonth (yearmonth, amount)
VALUES('2004','Apr'778.0000)
INSERT INTO sales.salesByMonth (yearmonth, amount)
VALUES('2004','May'78.0000)
INSERT INTO sales.salesByMonth (yearmonth, amount)
VALUES('2004','Jun'9.0000)
INSERT INTO sales.salesByMonth (yearmonth, amount)
VALUES('2004','Jul'987.0000)
INSERT INTO sales.salesByMonth (yearmonth, amount)
VALUES('2004','Aug'866.0000)
INSERT INTO sales.salesByMonth (yearmonth, amount)
VALUES('2004','Sep'7787.0000)
INSERT INTO sales.salesByMonth (yearmonth, amount)
VALUES('2004','Oct'85576.0000)
INSERT INTO sales.salesByMonth (yearmonth, amount)
VALUES('2004','Nov'855.0000)
INSERT INTO sales.salesByMonth (yearmonth, amount)
VALUES('2004','Dec'5878.0000)
INSERT INTO sales.salesByMonth (yearmonth, amount)
VALUES('2005','Jan'7.0000)
INSERT INTO sales.salesByMonth (yearmonth, amount)
VALUES('2005','Feb'6868.0000)
INSERT INTO sales.salesByMonth (yearmonth, amount)
VALUES('2005','Mar'688.0000)
INSERT INTO sales.salesByMonth (yearmonth, amount)
VALUES('2005','Apr'9897.0000)

我们想要得到类似这样的结果:
Year  Jan            Feb             Mar       ..............
----- ---------- ----------- -----------
2004 789.0000 389.0000     8867.0000 .............
2005 7.0000     6868.0000   688.0000 ..............

上一篇文章介绍的方法当然可以实现,但现在这里想要的列是固定的,不是动态的,就是12个月,所以也可以这样子来用:

SELECT year,
SUM(case when month = 'Jan' then amount else 0 endAS 'Jan',
SUM(case when month = 'Feb' then amount else 0 endAS 'Feb',
SUM(case when month = 'Mar' then amount else 0 endAS 'Mar',
SUM(case when month = 'Apr' then amount else 0 endAS 'Apr',
SUM(case when month = 'May' then amount else 0 endAS 'May',
SUM(case when month = 'Jun' then amount else 0 endAS 'Jun',
SUM(case when month = 'Jul' then amount else 0 endAS 'Jul',
SUM(case when month = 'Aug' then amount else 0 endAS 'Aug',
SUM(case when month = 'Sep' then amount else 0 endAS 'Sep',
SUM(case when month = 'Oct' then amount else 0 endAS 'Oct',
SUM(case when month = 'Nov' then amount else 0 endAS 'Nov',
SUM(case when month = 'Dec' then amount else 0 endAS 'Dec'
FROM sales.salesByMonth
GROUP by year

但这样事实上还是相当麻烦的,现在SQLSERVER2005中有更方便的实现方法。

SELECT Year,[Jan],[Feb],[Mar],[Apr],[May],[Jun],[Jul],[Aug],[Sep],[Oct],[Nov],[Dec]
FROM (
  
SELECT year, amount, month
  
FROM sales.salesByMonth ) AS salesByMonth
PIVOT ( 
SUM(amount) FOR month IN
  (
[Jan],[Feb],[Mar],[Apr],[May],[Jun],[Jul],[Aug],[Sep],[Oct],[Nov],[Dec])
  ) 
AS ourPivot
ORDER BY Year

就是这样,很简单的用法,效果是完全一样的。

我们再尝试一下把year去掉:

SELECT [Jan],[Feb],[Mar],[Apr],[May],[Jun],[Jul],[Aug],[Sep],[Oct],[Nov],[Dec]
FROM ( SELECT amount, month
FROM sales.salesByMonth ) AS salesByMonth
PIVOT ( 
SUM(amount) FOR month IN
(
[Jan],[Feb],[Mar],[Apr],[May],[Jun],[Jul],[Aug],[Sep],[Oct],[Nov],[Dec])
AS ourPivot

得到的结果是:
Jan                 Feb                 Mar             ...
---------- ------------ -----------
796.0000     7257.0000     9555.0000     ...

同一个月份的数据累加到一起。

再给个微软官方的例子: