SQL行转列PIVOT关键字的用法
来源:互联网 发布:seo原创怎么写 编辑:程序博客网 时间:2024/06/06 00:10
昨天写报表遇到行转列,原来都是使用动态sql来实现,这次尝试使用了下pivot来实现,pivot是sql server2005后加入的关键字,它使用起来比较方便,比起动态sql会简化很多。
基本语法:select 列1,[A],[B],[C]... from table pivot (聚合函数(列1) for 列2 in ([A],[B],[C]......)) as t
例1:
1.数据准备
CREATE TABLE #profit(Yer_mon VARCHAR(20), dep_nam VARCHAR(20), prf_amt INT)INSERT INTO #profit( Yer_mon, dep_nam, prf_amt )VALUES ( '201301', '深圳分行', 10 )INSERT INTO #profit( Yer_mon, dep_nam, prf_amt )VALUES ( '201301', '北京分行', 20 )INSERT INTO #profit( Yer_mon, dep_nam, prf_amt )VALUES ( '201302', '上海分行', 5 )INSERT INTO #profit( Yer_mon, dep_nam, prf_amt )VALUES ( '201303', '深圳分行', 20 )INSERT INTO #profit( Yer_mon, dep_nam, prf_amt )VALUES ( '201303', '广州分行', 50 )SELECT * FROM #profit
Yer_mon dep_nam prf_amt
-------------------- -------------------- -----------
201301 深圳分行 10
201301 北京分行 20
201302 上海分行 5
201303 深圳分行 20
201303 广州分行 50
下面我们将Yer_mon列中的内容转为列名,sql:
SELECT dep_nam ,[201301] ,[201302] ,[201303]FROM #profit PIVOT ( SUM(prf_amt) FOR Yer_mon IN ( [201301],[201302],[201303] ) ) AS t
输出:
dep_nam 201301 201302 201303
-------------------- ----------- ----------- -----------
北京分行 20 NULL NULL
广州分行 NULL NULL 50
上海分行 NULL 5 NULL
深圳分行 10 NULL 20
注意:1.pivot行转列中展示列必须使用聚合函数,如:sum、avg、count、max、min等;
2.pivot处理的列其实就相当于一个数据表,这里必须给它加上别名;
问:如果我们要转的列内容是日期类型或者字符串类型怎么办?这个时候可以使用max或者min函数巧妙的达到我们的目的,请看下面这个例子:
例2:
我们这里有张表#t:
SaleServiceGUID ServiceProc CompleteDate
------------------------------------ ------------------------------ -----------------------
002DBBDD-7C90-4F62-8071-00749D89BA03 到访日期 2012-12-25
002DBBDD-7C90-4F62-8071-00749D89BA03 未办理 2012-06-06
002DBBDD-7C90-4F62-8071-00749D89BA03 入伙日期 2012-12-25
002DBBDD-7C90-4F62-8071-00749D89BA03 已办理产权 2013-04-29
002DBBDD-7C90-4F62-8071-00749D89BA03 物业费起计时间 2013-02-01
A31087ED-27B1-422A-BEB2-057B87FA6782 物业费起计时间 2013-10-01
A31087ED-27B1-422A-BEB2-057B87FA6782 入伙日期 2013-07-03
A31087ED-27B1-422A-BEB2-057B87FA6782 到访日期 2013-07-03
A31087ED-27B1-422A-BEB2-057B87FA6782 未办理 2012-12-29
我们要把ServiceProc转为列名,数据内容是字段CompleteDate,在已知列数情况下我们可以这样写:
SELECT SaleServiceGUID,[未办理],[到访日期],[入伙日期],[物业费起计时间],[已办理产权] FROM #t PIVOT ( MAX(CompleteDate) FOR ServiceProc IN ([未办理],[到访日期],[入伙日期],[物业费起计时间],[已办理产权])) AS t
输出:
SaleServiceGUID 未办理 到访日期 入伙日期 物业费起计时间 已办理产权
------------------------------------ ----------------------- ----------------------- ----------------------- ----------------------- -----------------------
002DBBDD-7C90-4F62-8071-00749D89BA03 2012-06-06 2012-12-25 2012-12-25 2013-02-01 2013-04-29
A31087ED-27B1-422A-BEB2-057B87FA6782 2012-12-29 2013-07-03 2013-07-03 2013-10-01 NULL
注意:这里我们使用了max聚合函数来取日期字段,同理如果是字符串类型的数据也可以使用这种写法。
- SQL行转列PIVOT关键字的用法
- SQL中PIVOT的用法
- SQL PIVOT关键字例
- 行转列:SQL SERVER PIVOT与用法解释
- 行转列:SQL SERVER PIVOT与用法解释
- 行转列:SQL SERVER PIVOT与用法解释
- sql 2005 pivot 用法
- sql 2005 pivot 用法
- sql 2005 pivot 用法
- pivot的用法
- SQL 2005中pivot and unpivot的用法
- sql行转列-pivot
- SQL pivot 行转列
- SQL SERVER PIVOT与用法解释
- t-sql中pivot用法(行列转换)
- Sql 2005的Pivot讲解
- Sql Server的Pivot函数
- sql server行转列 Pivot UnPivot
- Android基础--shape的使用 二
- 立此存照
- VS2010下使用STLport编译boost时遇到的一些问题
- JavaScript之继承
- 我的常用Sql备忘录(不定时更新)
- SQL行转列PIVOT关键字的用法
- 单例模式
- 题目1254:N皇后问题(DFS)
- Java设计模式-观察者模式
- 各类寄存器总结
- N! HDU 1042
- openstack学习之知识准备
- 它处资料:多柱汉诺塔最优算法设计探究
- Java输入输出流