行列互转


一:列转行

如:SNAME  JAVA  ORACLE    PHP --以列的形式表示成绩


          大张     89        90             98

转换成行的形式表示:SNAME COURSE SCORE

                                     大张     JAVA           89

                                     大张     ORACLE     90

                                     大张      PHP            98

转换思想:将不同的列转换时变成不同的行显示

先查出每一行的数据,然后使用UNION进行合并,在进行select查询时产生临时表,重构了新表结构

UNION :将两张表结构相同的表合成一张,并自动删除重复记录

执行前:
行列互转


SELECT sname, 'java' course,JAVA  ---//查询出课程java的所有行并以course为别名以及java的成绩
FROM temp_student_score   
UNION
SELECT sname, 'oracle' course,oracle ---//查询出课程oracle的所有行并以course为别名以及oracle的成绩
FROM temp_student_score
UNION
SELECT sname, 'php' course,php ---//查询出课程php的所有行并以course为别名以及php的成绩
FROM temp_student_score


执行后结果:

行列互转

二:行转列

首先数据是成行显示


就是将一中的结果图转成执行前的图

思想:将同一个姓名的多条行数据转换成一行多列的数据

因此想到了group by 即根据查询姓名进行分组,每一行是不同姓名的信息。

 

decode(数据/表达式,判断结果,结果1,结果2):如果数据/表达式与判断结果相等,则取值为结果1,否则

 

取值结果2

 

SELECT SNAME,
SUM(DECODE(COURSE, 'JAVA', s.SCORE, 0)) JAVA,
SUM(DECODE(COURSE, 'ORACLE', s.SCORE, 0)) ORACLE,
SUM(DECODE(COURSE, 'PHP', s.SCORE, 0)) PHP
FROM student s
GROUP BY SNAME;

 

你可能感兴趣的:(by,group,decode(),行列互转)