如下格式:
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 60
2、通过使用聚合函数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
看得到我们想要的结果了吧。