行转列
主要原理是利用decode函数、聚集函数(sum),结合group by分组实现的
decode函数
其具体的语法格式如下:
DECODE(input_value,value,result[,value,result…][,default_result]);
其中:
input_value 试图处理的数值。
DECODE函数将该数值与一系列的序偶相比较,以决定最后的返回结果
value 是一组成序偶的数值。如果输入数值与之匹配成功,则相应的结果将被返回。对应一个空的返回 值,可以使用关键字NULL于之对应
result 是一组成序偶的结果值
default_result 未能与任何一序偶匹配成功时,函数返回的默认值
eg:
行转列
CREATE TABLE tb( 姓名 VARCHAR(10),课程 VARCHAR(10),分数 number);
insert into tb VALUES ('张三','语文',74);
insert into tb VALUES ('张三','数学',83);
insert into tb VALUES ('张三','物理',93);
insert into tb VALUES ('李四','语文',74);
insert into tb VALUES ('李四','数学',84);
insert into tb VALUES ('李四','物理',94);
SELECT * FROM tb;
展示如下:
select tb.姓名,
sum(decode(tb.课程, '语文', 分数,null)) as CHINESE,
sum(decode(tb.课程, '数学', 分数,null)) as MATH,
sum(decode(tb.课程, '物理', 分数,null)) as Physics
from tB
group by tB.姓名
order by tB.姓名;
如果需要保留表中的某个字段,需要在select语句中写出,然后采用分组函数;
CASE...WHEN
---行转列
---case ...when
create table nu (name varchar2(20));
select * from nu for update;
SELECT SUM(A) A, SUM(B) B, SUM(C) C, SUM(D) D, SUM(E) E
FROM
(SELECT
CASE WHEN name = 'a' THEN 1 ELSE 0 END AS A,
CASE WHEN name = 'b' THEN 2 ELSE 0 END AS B,
CASE WHEN name = 'c' THEN 3 ELSE 0 END AS C,
CASE WHEN name = 'd' THEN 4 ELSE 0 END AS D,
CASE WHEN name = 'e' THEN 5 ELSE 0 END AS E
FROM nu
GROUP BY name);
其中如果表中存在多行,则case when 的执行语句then中是列的名字。