原文出处:[SQL指令]使用 PIVOT 和 UNPIVOT,「扭转」查询的结果。
http://www.dotblogs.com.tw/mis2000lab/archive/2010/12/24/ms_sql_pivot_unpivot.aspx
假设我有一个 Table,记录了每一个月、各分店的销售金额(或是销售量)
这样的 数据库 Table如果要作年度的汇总运算,
很可能查出来的结果会是这个样子。
年度 |
销售量 |
2010 |
100,000 |
2009 |
80,000 |
2008 |
50,000 |
毕竟,Table里面的每一列记录,都是横的(一列、一列)
透过 Group by或是 Count()计算之后,成果也必然是这样。
但,有时候要产生这样的报表,就很伤脑筋了。
偏偏大部分的 User满喜欢这种输出成果。
2008 |
2009 |
2010 |
50,000 |
80,000 |
100,000 |
如果您听不懂我的叙述,请看以下的「第一篇 推荐文章(张小呆 的大作)」,有图片解说。
新版本的 MS SQL 2005开始,多了新方法来处理这样「数据表的结果 "逆转"」
简单的说,把原本(上图一)的年度「字段(Column)」,扭转(转向)成一列「资料列 (Row / 一笔纪录)」
原厂的说明文件如下:http://msdn.microsoft.com/zh-tw/library/ms177410.aspx
使用 PIVOT 和 UNPIVOT
您可以使用 PIVOT 和 UNPIVOT 关系运算子,将资料表值表达式变更为另一个数据表。PIVOT 会将表达式内一个数据行中的唯一值转成输出中的多个数据行,以旋转数据表值表达式,然后依据最终输出的需要,对其余的任何数据行值执行必要的汇总。UNPIVOT 执行的作业则与 PIVOT 相反,它会将数据表值表达式旋转为数据行值。
Sorry......上面的说明的确很像火星文
但有三篇文章讲得更浅显易懂(我推荐这三篇文章):
张小呆 http://www.dotblogs.com.tw/dc690216/archive/2010/02/04/13478.aspx......图文并茂,很赞喔!
Rely1020 http://rely1020.blog.ithome.com.tw/post/1606/39111......把语法与理论讲得很清楚。
看完上面两篇文章的解释,您多看一个范例(练习、比对一下),就会懂了。
黑暗执行绪 http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/07/20/tips-using-pivot-in-sql-2005.aspx
如果您不想使用(或是无法使用这种方法的话)
这本书的附录 A也有另外一种解法。请看文章标题 -- 「想把横向列数据改成多栏数据时,该怎么作?」页数533
但我觉得这方法不如PIVOT 和 UNPIVOT好用
书名:SQL语法范例辞典(旗标出版社)
作者:朝井 淳
另外,杨志强老师在 旗标出版社推出的「T-SQL 实战学堂」一书,
里面的 Ch .6-4节(数据合并与转向)也有解说 PIVOT 和 UNPIVOT。
....................................................................................................寄信给我 mis2000lab (at)雅虎.com.台湾 ........
ASP.NET案例精编(清华大学出版社 / 作者MIS2000Lab)
http://www.china-pub.com/46063
2009/5/15上市
市场价 :¥59.80 RMB(人民幣)