使用Oracle实现表的转置(oracle中表的转置)

使用Oracle实现表的转置

在数据处理中,往往需要将行转置为列,或将列转置为行,这个过程被称为表的转置。在Oracle数据库中,可以使用一些简单的SQL语句来实现表的转置,本文将介绍实现表的转置的方法。

转置行变成列

我们来看一下如何将行转置为列,在Oracle中,可以使用pivot语句来实现。

假设我们有一个表student,里面存储了学生的姓名、科目和成绩:

CREATE TABLE student (
sid INT,
sname VARCHAR2(50),
subject VARCHAR2(50),
score NUMBER
)

INSERT INTO student VALUES (1, 'Cathy', 'Math', 80);
INSERT INTO student VALUES (1, 'Cathy', 'English', 90);
INSERT INTO student VALUES (2, 'Bob', 'Math', 95);
INSERT INTO student VALUES (2, 'Bob', 'English', 85);

现在我们想将学生的姓名作为列名,科目作为行名,成绩填到对应的单元格中,可以使用如下的SQL语句来实现:

SELECT * FROM (
SELECT sname, subject, score FROM student
)
PIVOT (
MAX(score) FOR sname IN ('Cathy' AS c_score, 'Bob' AS b_score)
) ORDER BY subject;

运行以上语句,输出结果如下所示:

SUBJECT   C_SCORE    B_SCORE
-------- --------- ---------
English 90 85
Math 80 95

上述SQL语句中,首先使用子查询将学生的姓名、科目和成绩查出来。然后在主查询中使用pivot关键字,将学生的姓名作为列名,使用的聚合函数为max,因为每个学生只有一个成绩。最后使用order by 子句按照科目排序,将结果输出。

转置列变成行

接下来,我们来看一下如何将列转置为行,在Oracle中可以使用unpivot语句来实现。

假设我们有一个表stu,里面存储了学生的ID、语文、数学和英语的成绩:

CREATE TABLE stu (
ID INT,
Chinese NUMBER,
Math NUMBER,
English NUMBER
)

INSERT INTO stu VALUES (1, 80, 90, 70);
INSERT INTO stu VALUES (2, 70, 85, 90);

现在我们想将每个学生的成绩分解成单独的行,可以使用如下的SQL语句来实现:

SELECT * FROM (
SELECT ID, Chinese, Math, English FROM stu
)
UNPIVOT (
Score FOR Subject IN (Chinese AS 'Chinese', Math AS 'Math', English AS 'English')
) ORDER BY ID, Subject;

运行以上语句,输出结果如下所示:

ID   SUBJECT   SCORE
--- -------- -----
1 Chinese 80
1 Math 90
1 English 70
2 Chinese 70
2 Math 85
2 English 90

上述SQL语句中,首先使用子查询将学生的ID、语文、数学和英语成绩查出来。然后在主查询中使用unpivot关键字,将科目作为列名,成绩作为对应的值,最后使用order by子句,按照ID和科目排序,将结果输出。

总结

通过上述示例,我们可以看到,在Oracle数据库中,使用pivot和unpivot语句可以轻松地实现表的转置。无论是将行转置为列,还是将列转置为行,只需要根据实际需求选择pivot或unpivot语句,并根据情况编写相应的聚合函数,即可轻松地实现表的转置。


数据运维技术 » 使用Oracle实现表的转置(oracle中表的转置)