SQL 行列转换

SQL 行列转换,第1张

前段时间有人问了一个问题,就是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函数轻松实现。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9632995.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存