DECODE函数实现列转行
来源:互联网 发布:云视通摄像头扫描软件 编辑:程序博客网 时间:2024/06/06 05:32
在实际的开发当中有时候会有让你做统计、做报表。
比如在学生选课管理系统中让你写出所有的学生的每一门可的成绩,这时候我们写的SQL得出的结果一般是每一个学生选了好多课,其中每一个课和对应的成绩都是一行记录。
下面我们分成两部来实现学生的成绩报表:
1、通过使用DECODE实现行列转换,查询出每个学生选的课程和相应的成绩。
现在不是流行说"那么,问题就来了!"这句话么。的确!对于细心的人来说那么问题就来了。
在这里我们为什么要使用MAX()而不使用SUM()、AVG()等等聚合函数?告诉大家其实在示例中确实上面3个聚合函数都能使用并且都能成功实现。但是如果在聚合函数里面的值是字符型的使用SUM()、AVG()还行么?答案是不行了,所以使用MAX()也算是一种兼容的考虑的。
比如在学生选课管理系统中让你写出所有的学生的每一门可的成绩,这时候我们写的SQL得出的结果一般是每一个学生选了好多课,其中每一个课和对应的成绩都是一行记录。
如下格式:
NAME COURSE GREAD---- ------ -----dai java 60dai c# 70dai c 80dai sql 90往往上面的格式不是我们想要的,我们想要的格式像如下所示:
NAME JAVA C# C SQL---- ---- -- -- ---dai 60 70 80 90下面我们就构造一个完整的示例来看看上面的情况要如何实现:
CREATE TABLE t( name VARCHAR2(10), course VARCHAR2(10), gread NUMBER)BEGININSERT INTO t VALUES('dai', 'java', 60);INSERT INTO t VALUES('dai', 'c#', 70);INSERT INTO t VALUES('dai', 'c', 80);INSERT INTO t VALUES('dai', 'sql', 90);INSERT INTO t VALUES('tu', 'java', 90);INSERT INTO t VALUES('tu', 'c#', 80);INSERT INTO t VALUES('tu', 'c', 70);INSERT INTO t VALUES('tu', 'sql', 60);END;以上的代码构造好了数据。
下面我们分成两部来实现学生的成绩报表:
1、通过使用DECODE实现行列转换,查询出每个学生选的课程和相应的成绩。
SELECT name,DECODE(course, 'java', gread) AS java,DECODE(course, 'c#', gread) AS c#,DECODE(course, 'c', gread) AS c,DECODE(course, 'sql', gread) AS sqlFROM t;NAME JAVA C# C SQL---------- ---------- ---------- ---------- ----------dai 60dai 70dai 80dai 90tu 90tu 80tu 70tu 602、通过使用聚合函数MAX()来实现化散为整
通过第一步的结果,我们发现使用DECODE构造出了由course字段组成了行,但是我们发现每一个课程和相应的成绩还是出现一行。但是你仔细观察,是不是只要将同一姓名的每一行往上压缩一下,就变成了一行了。那我们要怎么做到嘞?在这里我们应该想到使用分组(GROUP BY)来实现。
SELECT name, MAX(DECODE(course, 'java', gread)) AS java, MAX(DECODE(course, 'c#', gread)) AS c#, MAX(DECODE(course, 'c', gread)) AS c, MAX(DECODE(course, 'sql', gread)) AS sqlFROM tGROUP BY name;NAME JAVA C# C SQL---------- ---------- ---------- ---------- ----------dai 60 70 80 90tu 90 80 70 60看得到我们想要的结果了吧。
现在不是流行说"那么,问题就来了!"这句话么。的确!对于细心的人来说那么问题就来了。
在这里我们为什么要使用MAX()而不使用SUM()、AVG()等等聚合函数?告诉大家其实在示例中确实上面3个聚合函数都能使用并且都能成功实现。但是如果在聚合函数里面的值是字符型的使用SUM()、AVG()还行么?答案是不行了,所以使用MAX()也算是一种兼容的考虑的。
1 0
- DECODE函数实现列转行
- oracle使用decode实现竖表转横表 (列转行)
- oracle-listagg()函数实现列转行
- 行转列,列转行,decode,case... when ... then ..
- 列转行函数
- 分段函数,列转行
- pivot实现列转行
- oracle nupivot函数实现行转列和pivot实现列转行
- Oracle 11g 新聚集函数listagg实现列转行
- Oracle 11g Pivot函数实现列转行
- Oracle 11g 新聚集函数listagg实现列转行
- WM_CONCAT LISTAGG函数,ORACLE列转行聚合的简单实现
- Oracle 11g 新聚集函数listagg实现列转行
- Oracle 11g Pivot函数实现列转行
- Oracle 列转行函数 Listagg()
- Oracle 列转行函数 Listagg()
- Oracle 列转行函数 Listagg()
- Oracle 列转行函数 Listagg()
- Could not load generated proxy: com.telly.groundy.generated GroudyTask错误
- 常见JAVA代码查错题及答案
- android获取状态栏高度
- 使用fusioncharts实时数据库来生成报表,描述趋势
- 3.1 Maximum likelihood and least square
- DECODE函数实现列转行
- Java管道 PipedInputStream PipedOutputStream
- Reconnaissance 2(水题)
- JAVA面试常见编程题总结
- RID、DR、BDR以及广播多路访问、非广播多路访问实验
- ios 通过调用系统摄像头拍照,拍视频,然后写入文件
- RadioGroup 的分列换行
- FrameSize、WinSize、VisibleSize、VisibleOrigin概念理解
- hdu4607:Park Visit