如下格式:
NAME COURSE GREAD ---- ------ ----- dai java 60 dai c# 70 dai c 80 dai sql 90往往上面的格式不是我们想要的,我们想要的格式像如下所示:
NAME JAVA C# C SQL ---- ---- -- -- --- dai 60 70 80 90下面我们就构造一个完整的示例来看看上面的情况要如何实现:
CREATE TABLE t( name VARCHAR2(10), course VARCHAR2(10), gread NUMBER ) BEGIN INSERT 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;以上的代码构造好了数据。
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 sql FROM t; NAME JAVA C# C SQL ---------- ---------- ---------- ---------- ---------- dai 60 dai 70 dai 80 dai 90 tu 90 tu 80 tu 70 tu 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 sql FROM t GROUP BY name; NAME JAVA C# C SQL ---------- ---------- ---------- ---------- ---------- dai 60 70 80 90 tu 90 80 70 60看得到我们想要的结果了吧。