[SQL指令]使用 PIVOT 和 UNPIVOT,「扭转」查询的结果。
2010-12-27 18:02
246 查看
原文出处:[SQL指令]使用 PIVOT 和 UNPIVOT,「扭转」查询的结果。
http://www.dotblogs.com.tw/mis2000lab/archive/2010/12/24/ms_sql_pivot_unpivot.aspx
假设我有一个 Table,记录了每一个月、各分店的销售金额(或是销售量)
这样的 数据库 Table如果要作年度的汇总运算,
很可能查出来的结果会是这个样子。
毕竟,Table里面的每一列记录,都是横的(一列、一列)
透过 Group by或是 Count()计算之后,成果也必然是这样。
但,有时候要产生这样的报表,就很伤脑筋了。
偏偏大部分的 User满喜欢这种输出成果。
如果您听不懂我的叙述,请看以下的「第一篇 推荐文章(张小呆 的大作)」,有图片解说。
新版本的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。
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 |
透过 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。
相关文章推荐
- 使用 PIVOT 和 UNPIVOT实现查询结果行转列
- 在SQL中直接使用存储过程查询返回的结果集
- 【原】SQL 使用 PIVOT 和 UNPIVOT 行转列 列转行
- T_SQL中使用正则表达式匹配查询结果
- Hibernate使用SQL查询结果总个数
- Hibernate3.2.6 原生sql 查询使用方法,将查询结果直接转换为POJO,不必非要指定属性大写
- 项目中sql语句使用max函数,但查询结果与需求不符!
- SQL 中IN、NOT IN 对结果含NULL的子查询使用
- SQL查询中行列转换 Pivot UnPivot,行显转列显
- Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集
- Oracle中使用pl/sql,查询结果可以直接修改sql语句-for update
- mybatis的sql中使用concat查询结果是乱码处理
- 使用 PIVOT 和 UNPIVOT sql server
- 使用 PIVOT 和 UNPIVOT(MS SQL Server行列转换)
- SQL行列转换,PIVOT与UNPIVOT的区别和使用方法举例
- Hibernate之使用sql语句查询多个表,返回多种字段,将返回结果映射到自定义的普通pojo类中
- 如何在Sql Server上使用一条SQL查询结果总数并且分页
- 数据库查询排序使用随机排序结果示例(Oracle/MySQL/MS SQL Server)
- Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集
- (转)PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理