orcle行转列的几种方式:
原始表结构如下:
id | stu_name | course | score |
---|---|---|---|
1 | Tom | java | 70 |
2 | Tom | jsp | 50 |
3 | Tom | script | 72 |
4 | Tom | vue | 84 |
5 | Bob | java | 73 |
6 | Bob | jsp | 91 |
7 | Bob | script | 97 |
8 | Bob | vue | 86 |
1、使用max + decode函数的方式
SELECT stu_name,
MAX(DECODE(course,'java ',score,0)) java,--这里使用max,min都可以
MAX(DECODE(course,'jsp',score,0)) jsp,
MAX(DECODE(course,'script',score,0)) script,
MAX(DECODE(course,'vue',score,0)) vue
FROM student_score
GROUP BY stu_name
转换后:
stu_name | java | jsp | script | vue |
---|---|---|---|---|
Tom | 70 | 50 | 72 | 84 |
Bob | 73 | 91 | 97 | 86 |
2、使用max+case when 的方式
其实原理和第一种方式差不多,只是在判断条件的时候一个是decode函数,一个是case when而已
SELECT stu_name,
MAX(CASE WHEN course='java ' THEN score ELSE 0)) java,
MAX(CASE WHEN course='jsp' THEN score ELSE 0)) jsp,
MAX(CASE WHEN course='script' THEN score ELSE 0))script,
MAX(CASE WHEN course='vue' THEN score ELSE 0)) vue
FROM student_score
GROUP BY stu_name
注意:需要考虑重复数据的处理的情况,如假如Tom有两条Java学科数据,一条是70,一条是90,则需要考虑如何处理,是求和还是取最大值
3、wmsys.wm_concat行列转换函数
缺点就是结果不是方便处理的表格
SELECT NAME,
wmsys.wm_concat(course || ':'||score) course
FROM student_score
GROUP BY NAME;