sql 行转列

转载 2010年12月11日 12:08:00
一、先建立测试数据    
CREATE TABLE sales.salesByMonth
(
year char(4),
month char(3),
amount money,
PRIMARY KEY (year, month)
)
 
INSERT INTO sales.salesByMonth (year, month, amount)
VALUES('2004','Jan', 789.0000)
INSERT INTO sales.salesByMonth (year, month, amount)
VALUES('2004','Feb', 389.0000)
INSERT INTO sales.salesByMonth (year, month, amount)
VALUES('2004','Mar', 8867.0000)
INSERT INTO sales.salesByMonth (year, month, amount)
VALUES('2004','Apr', 778.0000)
INSERT INTO sales.salesByMonth (year, month, amount)
VALUES('2004','May', 78.0000)
INSERT INTO sales.salesByMonth (year, month, amount)
VALUES('2004','Jun', 9.0000)
INSERT INTO sales.salesByMonth (year, month, amount)
VALUES('2004','Jul', 987.0000)
INSERT INTO sales.salesByMonth (year, month, amount)
VALUES('2004','Aug', 866.0000)
INSERT INTO sales.salesByMonth (year, month, amount)
VALUES('2004','Sep', 7787.0000)
INSERT INTO sales.salesByMonth (year, month, amount)
VALUES('2004','Oct', 85576.0000)
INSERT INTO sales.salesByMonth (year, month, amount)
VALUES('2004','Nov', 855.0000)
INSERT INTO sales.salesByMonth (year, month, amount)
VALUES('2004','Dec', 5878.0000)
INSERT INTO sales.salesByMonth (year, month, amount)
VALUES('2005','Jan', 7.0000)
INSERT INTO sales.salesByMonth (year, month, amount)
VALUES('2005','Feb', 6868.0000)
INSERT INTO sales.salesByMonth (year, month, amount)
VALUES('2005','Mar', 688.0000)
INSERT INTO sales.salesByMonth (year, month, amount)
VALUES('2005','Apr', 9897.0000)
 
二、对上述数据进行行转列
 
方法一:大家都常用的方法:select case
 
SELECT year,
SUM(case when month = 'Jan' then amount else 0 end) AS 'Jan',
SUM(case when month = 'Feb' then amount else 0 end) AS 'Feb',
SUM(case when month = 'Mar' then amount else 0 end) AS 'Mar',
SUM(case when month = 'Apr' then amount else 0 end) AS 'Apr',
SUM(case when month = 'May' then amount else 0 end) AS 'May',
SUM(case when month = 'Jun' then amount else 0 end) AS 'Jun',
SUM(case when month = 'Jul' then amount else 0 end) AS 'Jul',
SUM(case when month = 'Aug' then amount else 0 end) AS 'Aug',
SUM(case when month = 'Sep' then amount else 0 end) AS 'Sep',
SUM(case when month = 'Oct' then amount else 0 end) AS 'Oct',
SUM(case when month = 'Nov' then amount else 0 end) AS 'Nov',
SUM(case when month = 'Dec' then amount else 0 end) AS 'Dec'
FROM sales.salesByMonth
GROUP by year
 
方法二:SQL2005/2008中的 Pivot 方法
 
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 MyPivot
ORDER BY Year
 
对上述Pivot语法结构的详细解释如下:
 

 

Povit:旋转
Pivoted:旋转的
Query:查询
Produce:生成、产生
alias:别名、化名
aggregation:聚合
optional:可选择的
clause:子句
 
PIVOT 提供的语法比一系列复杂的 SELECT...CASE 语句中所指定的语法更简单和更具可读性。有关 PIVOT 语法的完整说明,请参阅 FROM (Transact-SQL)。
以下是带批注的 PIVOT 语法。
SELECT <non-pivoted column>,
    [first pivoted column] AS <column name>,
    [second pivoted column] AS <column name>,
    ...
    [last pivoted column] AS <column name>
FROM
    (<SELECT query that produces the data>)
    AS <alias for the source query>
PIVOT
(
    <aggregation function>(<column being aggregated>)
FOR
[<column that contains the values that will become column headers>]
    IN ( [first pivoted column], [second pivoted column],
    ... [last pivoted column])
) AS <alias for the pivot table>
<optional ORDER BY clause>;

MySQL 实现行转列SQL

概述 好久没写SQL语句,今天看到问答中的一个问题,拿来研究一下。 问题链接:关于Mysql 的分级输出问题 情景简介 学校里面记录成绩,每个人的选课不一样,而且以后会添加课程...
  • sxdtzhaoxinguo
  • sxdtzhaoxinguo
  • 2017年02月17日 18:41
  • 7195

一个略微复杂的Sql行转列实例

表结构如上,RoomId为房间号,IsPresent为1表示该房间有人,IsPresent为0表示该房间没人。现在需要统计每个房间以1开始、以0结束的时间,如果有连续的1则取第一个1创建时间为开始时间...
  • xiaouncle
  • xiaouncle
  • 2017年01月22日 15:52
  • 633

mysql行转列小技巧

参考文章http://blog.csdn.net/u013938484/article/details/50552747,测试了一下很不错。 下面是具体的测试过程: 数据表结构: 采用经典的学生,课程...
  • wulantian
  • wulantian
  • 2016年09月28日 10:10
  • 17977

SQL批量行转列已经多个字段拼接

第二步:运行一下SQL,就可以得出以下拼接(合并)效果。关键点是where jobId=V_WIP_Balance.jobId   。你想要第一个显示什么,这个ID就要在视图中查出来,不然会数据有误,...
  • lirongjiancnvto
  • lirongjiancnvto
  • 2017年04月24日 08:30
  • 379

行转列之随着记录数增加,列数不固定,且不是多少条行边多少列

具体描述不出来,看图片:
  • u012366626
  • u012366626
  • 2014年10月13日 22:24
  • 683

在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)

最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。 ...
  • yupeigu
  • yupeigu
  • 2016年01月13日 14:32
  • 1540

SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)

2014-05-26 16:09 by 听风吹雨, 1031 阅读, 16 评论, 收藏, 编辑 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents)背景...
  • weizhiai12
  • weizhiai12
  • 2014年05月27日 13:21
  • 19131

SQl查询行转列

数据库-行转列的语法                                       表: PerTab 字段:name,  title,  values 原内容:一月  产品A   12...
  • lsfhack
  • lsfhack
  • 2017年04月08日 08:32
  • 539

SQL行转列经典例子(转载)

行转列问题总结 1、行转列 ---1、最简单的行转列 /*    问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李...
  • lxl743p
  • lxl743p
  • 2015年04月20日 09:47
  • 2287

SQL 行轉列 與 列轉行

先準備點數據: CREATE TABLE Sell ( [Year] INT, [Quarter] NVARCHAR(10), Quantity INT ) GO INSERT INTO...
  • Benjayming
  • Benjayming
  • 2013年12月08日 18:44
  • 6863
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sql 行转列
举报原因:
原因补充:

(最多只允许输入30个字)