sql行转列

近期在做项目时,用户给出了几张报表的需求,需要对数据进行汇总。在这个过程中,用到了关于sql语句行转列的方法。那么应该如何操作呢?

项目中的过程比较复杂,我就自己建立一个测试库来进行说明。

首先建立数据表test,添加三个字段:姓名(name,varchar2(10))、课程(course,varchar2(10))、分数(score,varchar2(10))。

插入数据:

insert into test(name,course,score) values('victor','物理',70)
insert into test(name,course,score) values('victor','英语',90)
insert into test(name,course,score) values('victor','数学',85)
insert into test(name,course,score) values('victor','语文',80)
insert into test(name,course,score) values('lucy','物理',90)
insert into test(name,course,score) values('lucy','英语',85)
insert into test(name,course,score) values('lucy','语文',85)
insert into test(name,course,score) values('lucy','数学',80)
insert into test(name,course,score) values('Jim','物理',85)
insert into test(name,course,score) values('Jim','数学',80)
insert into test(name,course,score) values('victor','语文',80)

正常情况下,我们使用查询语句,查询到的结果是:

而当我们要统计个人信息时,就不能这样显示,需要把每个人的信息放到一行。做到这一点,我们有两种方法。一种是,通过上述查询语句得到结果,然后在程序中进行数据拆分与组合,按用户的要求进行选择。而另一种方法是,使用sql语句进行数据处理,这就用到了sql中的行转列。如下:

select name,
       sum(case Course when '语文' then Score else null end) 语文,
       sum(case Course when '数学' then Score else null end) 数学,
       sum(case Course when '英语' then Score else null end) 英语,
       sum(case Course when '物理' then Score else null end) 物理
  from test
 group by name

得到的结果如下:

这种方法使用的是sum和case when的组合进行查询的,由于case when可以用于sql server,所以此方法既可以在sql server中应用,也可以在oracle中使用。而实现上述功能还可以使用sum和decode函数结合,但是由于decode函数只能在oracle数据库中应用。方法如下:

select name,
       sum(decode(course, '语文', score)) 语文,
       sum(decode(course, '数学', score)) 数学,
       sum(decode(course, '英语', score)) 英语,
       sum(decode(course, '物理', score)) 物理
  from test
 group by name

这样就可以将我们所要的信息组合起来,进行信息统计。

sum函数主要是用来求和的;decode函数是对数据进行处理,可以将数据结果翻译成其他值,其作用效果与case when的效果是一样的。

小结:

通过这次的需求实现,对sql的用法又增加了一点认识,感觉到sql的强大之处,自己在这方面的学习还需要进一步加深。这次的实现是通过函数之间的结合来实现的,在今后的学习中,应该学习这方面的思想,不能只想着一种函数的应用,而忽略结合后的强大用法。

时间: 2024-10-08 01:30:01

sql行转列的相关文章

SQL 行转列查询汇总

SQL行转列汇总 PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 注意:PIVOT.UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别(在数据库属性->选项->兼容级别改为 90 ) SQL2008 中可以直接使用 完整语法: table_source PIVOT( 聚合函数(value_column) F

Sql 行转换为列 以及列转换为行的心得

这是 创建数据库的脚本文件 CREATE TABLE [dbo].[stu]( [学号] [nvarchar](255) NOT NULL, [姓名] [nvarchar](255) NULL, [性别] [nvarchar](255) NULL, [专业] [nvarchar](255) NULL, [院系] [nvarchar](255) NULL ) ON [PRIMARY] GO INSERT [dbo].[stu] ([学号], [姓名], [性别], [专业], [院系]) VALU

SQL 行转列

---1.最简单的行转列/* 问题:假设有张学生成绩表(tb)如下:姓名 课程 分数张三 语文 74张三 数学 83张三 物理 93李四 语文 74李四 数学 84李四 物理 94 想变成(得到如下结果): 姓名 语文 数学 物理 李四 74   84   94张三 74   83   93*/--测试用 IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb] GO create table tb(姓名 varchar(10) , 课程 varchar(

SQL行转列汇总

SQL行转列汇总 PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 注意:PIVOT.UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别(在数据库属性->选项->兼容级别改为   90 ) SQL2008 中可以直接使用 完整语法: table_source PIVOT( 聚合函数(value_column)

sql 行转列总结

原文:sql 行转列总结 PIVOT UNPIVOT的用法 PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (-) )AS P 完整语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT用于将列明转为列值(即列转行),在SQL Server 2

sql 行转列 PIVOT 列转行 UNPIVOT

原文:sql 行转列 PIVOT 列转行 UNPIVOT 一: 现有表一(t_table1),想转为表二(t_table2)的格式. 表一: 年 公司 收入 2013 公司1 12 2013 公司2 22 2013 公司3 32 2012 公司1 42 2012 公司2 52 2012 公司3 62 表二: 年 公司1 公司2 公司3 2012 42 52 62 2013 12 22 32 可使用sql2005之后提供的PIVOT 具体操作如下: select * from   t_table1

sql 行专列 列转行 普通行列转换

转载:http://www.cnblogs.com/newwind521/archive/2010/11/25/1887203.html sql 行专列 列转行 普通行列转换 /* 标题:普通行列转换(version 2.0) 作者:爱新觉罗.毓华 时间:2008-03-09 地点:广东深圳 说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法.  问题:假设有张学生成绩表(tb)如

SQL行转列 (及EAV模型获取数据)

参考文章: http://www.williamsang.com/archives/1508.html 情景简介 学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列.数据库grade里面数据如下图,假定每个人姓名都不一样,作为主键.本文以MySQL为基础,其他数据库会有些许语法不同. 数据库数据: 处理后效果: 下面介绍三种方法: 方法一: 1 2 3 4 5 SELECT DISTINCT  a.name, (SELECT score FROM grade b

SQL行、列互转汇总

转自:http://www.cnblogs.com/maanshancss/archive/2013/03/13/2957108.html PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 注意:PIVOT.UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别(在数据库属性->选项->兼容级别改为   90 )