前段时间有人问了一个问题,就是SQL的行列转换,当时有点懵没答上来,后来细细想一想,其实最近的一个项目就已经用到了。
基础数据如下:
要求根据当年的月份去统计出每一个ID的汇总金额。就是把行中的月切换到列中。
最后效果如下:
参考资料: https://technet.microsoft.com/zh-cn/library/ms177410(v=sql.105).aspx#%E5%A4%8D%E6%9D%82%20PIVOT%20%E7%A4%BA%E4%BE%8B
带批注的 PIVOT 语法。
如果聚合函数与 PIVOT 一起使用,则计算聚合时将不考虑出现在值列中的任何空值。
新建两张表
查询结果
--UNPIVOT 函数
--单纯用SQL 处理 ,原理很简单,就是对每个需要置换的列单独处理出来
最终效果:
--用上面的结果新建表
--PIVOT
-- SQL直接处理,先用CASE 语句将每行处理出来,然后在用聚合去处理合并相同ID的行。
这是一个典型的 行列转换问题。这些数据应该有着统一的一列吧,例如:标识人员的身份z号码之类的。方法别人博客中都很详尽,我就不在此罗列了。 可检索关键字 “SQL 行列转换”或者看下面链接http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html
http://hi.baidu.com/wrgcxfcoybinpur/item/90f388e2ec0f853286d9decc
方法/步骤
首先我们建立一张表,名为RToC,各个字段的设计如下图,分别是name,course,score,表示姓名,成绩与分数,如图所示。
我们往表中加入数据,分别添加小明与小花的语文和数学成绩,如图所示。
接下来,我们要进行行列转换,列应该是name,语文,数学。我们首先要考虑是如何得到列名,我们可以通过分组得到课程名称。如图所示,我们通过分组语句,从查询结果我们可以看出课程名的拼接字符串。
接下来,关键的行转列的函数pivot出场了,通过这个函数我们把分数填充到转换的列语文、数学的列值。
我们运行后,可以得到行转列的结果,如下图所示。
通过以上几个步骤,我们就可以轻松的实现行列转换了。同样,我们如果要把列转换成行, 应该怎么做呢?同样我们可以采用unpivot函数轻松实现。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)