使用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 901 English 70
2 Chinese 702 Math 85
2 English 90
上述SQL语句中,首先使用子查询将学生的ID、语文、数学和英语成绩查出来。然后在主查询中使用unpivot关键字,将科目作为列名,成绩作为对应的值,最后使用order by子句,按照ID和科目排序,将结果输出。
总结
通过上述示例,我们可以看到,在Oracle数据库中,使用pivot和unpivot语句可以轻松地实现表的转置。无论是将行转置为列,还是将列转置为行,只需要根据实际需求选择pivot或unpivot语句,并根据情况编写相应的聚合函数,即可轻松地实现表的转置。