T-SQL语句中,Pivot运算符用于在列和行之间对数据进行旋转或透视转换,PIVOT命令可以实现数据表的列转行,同时执行聚合运算,UNPIVOT则与其相反,实现数据的行转列。
PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。UNPIVOT与PIVOT执行相反的操作,将表值表达式的列转换为列值。
通俗简单的说:PIVOT就是行转列,UNPIVOT就是列传行
一 PIVOT实例
1. 建表
建立一个销售情况表,其中,year字段表示年份,quarter字段表示季度,amount字段表示销售额。quarter字段分别用Q1, Q2, Q3, Q4表示一、二、三、四季度。
![6c7324f3c59013730660652efa68b1c5.png](https://i-blog.csdnimg.cn/blog_migrate/f426de1c43b7f08afd47ef98b83b30fd.jpeg)
2. 填入表数据
使用如下程序填入表数据。
![0bea107a5ccf4d2c5dc65dcb9249494a.png](https://i-blog.csdnimg.cn/blog_migrate/ad94f34bfd80cebcf9b23d362dd73578.jpeg)
3. 如果我们要比较每年中各季度的销售状况,要怎么办呢?有以下两种方法:
(1)使用传统Select的CASE语句查询
在SQL Server以前的版本里,将行级数据转换为列级数据就要用到一系列CASE语句和聚合查询。虽然这种方式让开发人员具有了对所返回数据进行高度控制的能力,但是编写出这些查询是一件很麻烦的事情。
![74a7704cc8baea202cbb2cbb1c96c2ca.png](https://i-blog.csdnimg.cn/blog_migrate/8be1e8f31361fe7062127fd45fd00528.jpeg)
得到的结果如下:
![745101adff4db91161b9b560c0b9a6f0.png](https://i-blog.csdnimg.cn/blog_migrate/df85c971af47305a035f402d7d4a3b86.jpeg)
(2)使用PIVOT
由于SQL Server 2005有了新的PIVOT运算符,就不再需要CASE语句和GROUP BY语句了。(每个PIVOT查询都涉及某种类型的聚合,因此你可以忽略GROUP BY语句。)PIVOT运算符让我们能够利用CASE语句查询实现相同的功能,但是你可以用更少的代码就实现,而且看起来更漂亮。
![3530ca474ad58af0453bedf95cf45d9f.png](https://i-blog.csdnimg.cn/blog_migrate/cabf7d65b43d748d0980f0db2ef00a25.jpeg)
得到的结果如下:
![f54df036596cb926d5a506b0ede3a791.png](https://i-blog.csdnimg.cn/blog_migrate/f0dcb96a891e9539e97b8640f6746008.jpeg)
二 UNPIVOT
1 建表
建立一个通讯录表
![0f77b38d78a74ee55f4243064356ba12.png](https://i-blog.csdnimg.cn/blog_migrate/4430e5aff9814ba647618484b0294103.jpeg)
2. 填入表数据
使用如下程序填入表数据。
![2e8e1e1b83c4de91810bbbd25b7ed515.png](https://i-blog.csdnimg.cn/blog_migrate/c198103f456f76670fa2eded0633ec26.jpeg)
3. 使用PIVOT列转行
![cfc1b1b31e08fb5ede8277d6dac1b818.png](https://i-blog.csdnimg.cn/blog_migrate/ce4a247e7f8d7d6a335c8a0f66e428dc.jpeg)
得到的结果如下:
![d02d690d1b13c093e0f03d865ce83c1d.png](https://i-blog.csdnimg.cn/blog_migrate/863b6e72d59803458d31901d79d92ca2.jpeg)