博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SQL行列转换,PIVOT与UNPIVOT的区别和使用方法举例

Posted on 2012-04-16 22:07  moss_tan_jun  阅读(3907)  评论(0编辑  收藏  举报

使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UNPIVOT,则可以很容易的实现行列转换的需求。

在本文中我们将通过两个简单的例子详细讲解PIVOT和UNPIVOT的用法。

 

PIVOT是行转列,用法如下:
假如表结构如下:
      id  name quarter  profile
      1     a        1         1000
      1     a        2         2000
      1     a        3         4000
      1     a        4         5000
      2     b        1         3000
      2     b        2         3500
      2     b        3         4200
      2     b        4         5500
  ----------------------------------------------
     使用PIVOT将四个季度的利润转换成横向显示:
       select id,name,
             [1] as "一季度",[2] as "二季度",[3] as "三季度",[4] as "四季度"
             from test
             pivot
             (
               sum(profile)
               for quarter in ([1],[2],[3],[4])
             )
             as pvt

 -----------------------------------------------
 得出的结果如下:
    id  name   一季度  二季度  三季度  四季度
    1     a         1000    2000     4000     5000
    2     b         3000    3500     4200     5500
                

========================================================================================


UNPIVOT是列转行,用法如下:
假如表结构如下:
    id   name    Q1        Q2       Q3        Q4                  
    1      a       1000    2000    4000     5000
    2      b       3000    3500    4200     5500
 -----------------------------------------------
    使用UNPIVOT,将同一行中四个季度的列数据转换成四行数据:
       select id,name,quarter,profile
           from test
           unpivot
           (
              profile
              for quarter in ([Q1],[Q2],[Q3],[Q4])
           )
           as unpvt


 -----------------------------------------------
 得出的结果如下:
    id   name   quarter    profile
    1       a         Q1        1000
    1       a         Q2        2000
    1       a         Q3        4000
    1       a         Q4        5000
    2       b         Q1        3000
    2       b         Q2        3500
    2       b         Q3        4200
    2       b         Q4        5500