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

推荐订阅源

WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
小众软件
小众软件
Vercel News
Vercel News
Last Week in AI
Last Week in AI
H
Help Net Security
The Cloudflare Blog
L
LangChain Blog
Microsoft Security Blog
Microsoft Security Blog
B
Blog RSS Feed
云风的 BLOG
云风的 BLOG
I
InfoQ
U
Unit 42
美团技术团队
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
Y
Y Combinator Blog
Hugging Face - Blog
Hugging Face - Blog
A
About on SuperTechFans
宝玉的分享
宝玉的分享
量子位
博客园_首页

博客园 - 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     ...

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

再给个微软官方的例子: