一:列转行
如: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;