首页 > 数据库技术 > 详细

SqlServer PIVOT函数快速实现行转列,UNPIVOT实现列转行

时间:2017-04-05 15:33:52      阅读:941      评论:0      收藏:0      [点我收藏+]

我们在写Sql语句的时候没经常会遇到将查询结果行转列,列转行的需求,拼接sql字符串,然后使用sp_executesql执行sql字符串是比较常规的一种做法。但是这样做实现起来非常复杂,而在SqlServer2005中我们有了PIVOT函数可以快速实现行转列和列转行的操作。

 

PIVOT函数的格式如下

PIVOT(<聚合函数>([集合列值]) FOR [行转列前的列名] IN([行转列后的列名1],[行转列后的列名2],[行转列后的列名3],.......[行转列后的列名N]))
  • <聚合函数>就是我们使用的SUM,COUNT,AVG等Sql聚合函数,也就是行转列后计算列的聚合方式。
  • [聚合列值]要进行聚合的列
  • [行转列前的列名]这个就是需要将行转换为列的列名。
  • [行转列后的列名]这里需要声明将行的值转换为列后的列名,因为转换后的列名其实就是转换前行的值,所以上面格式中的[行转列后的列名1],[行转列后的列名2],[行转列后的列名3],......[行转列后的列名N]其实就是[行转列前的列名]每一行的值。

 

下面我们来看一个例子有一张表名为[ShoppingCart]有三列[Week],[TotalPrice],[GroupId],数据如下所示:

技术分享

现在我们是用PIVOT函数将列[WEEK]的行值转换为列,并使用聚合函数Count(1)来统计每一个Week列在转换前有多少行数据,语句如下所示:

select *
from ShoppingCart as C 
PIVOT(count(TotalPrice) FOR [Week] IN([1],[2],[3],[4],[5],[6],[7])) AS T 

查询结果如下:

技术分享

我们可以看到PIVOT函数成功地将[ShoppingCart]表列[Week]的行值转换为了七列,并且每一列统计转换前的行数为1,这符合我们的预期结果。那么根据我们前面定义的PIVOT函数转换格式,在本例中我们有如下公式对应值:

  • <聚合函数>本例中为Count
  • [聚合列值]本例中就是1,统计了行转列前的行数
  • [行转列前的列名]本例中为[Week]
  • [行转列后的列名]本例中为[1],[2],[3],[4],[5],[6],[7]七个列

 

SqlServer PIVOT函数快速实现行转列,UNPIVOT实现列转行

原文:http://www.cnblogs.com/OpenCoder/p/6668882.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!