近期在做项目时,用户给出了几张报表的需求,需要对数据进行汇总。在这个过程中,用到了关于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