原文地址:http://www.2cto.com/database/201108/100792.html
SELECT行列转换
第一部分:行转列
新建一个表:
CREATE TABLE HANG2LIE
(
"ID" NUMBER,
"NAME" VARCHAR2(20),223)">
"COURSE" VARCHAR2(20),223)">
"score" NUMBER
)
declare
begin
for i in 1..3 loop
end loop;
end;
/
数据列出来如下:
--- ------- ---- -----
要实现的行转列的效果如下(或者类似的结果):
--- ------- --------------------
from HANG2LIE
group by id,name;
---------------------decode---------------------
主要作用:将查询结果翻译成其他值(即以其他形式表现出来,以下举例说明);
使用方法:
Select decode(columnname,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
From talbename
Where …
其中columnname为要选择的table中所定义的column,
---------------------------------------------
2、通过decode函数:
sum(decode(course,'数学',null)) "数学",'英语',null)) "英语",'历史',null)) "历史",'化学',null)) "化学"
得到的结果:
--- ------- ---------- ---------- ---------- ---------- ----------
3、通过case表达式
sum(case when course='数学' then score end) "数学",223)">
sum(case when course='英语' then score end) "英语",223)">
sum(case when course='历史' then score end) "历史",223)">
sum(case when course='化学' then score end) "化学"
得到的结果和第二种实际上是一样的,其实语句也是一样的,只不过把decode函数换成了case when表达式而已
第二部分:列转行
图省力呢,根据上面的表新建一个表:
create table lie2hang as
sum(case when course='数学' then score end) Math,223)">
sum(case when course='英语' then score end) English,223)">
sum(case when course='历史' then score end) History,223)">
sum(case when course='化学' then score end) Chemistry
from hang2lie
结构如下:
--- -------- ---- -----
1、集合查询
实现的sql语句:
score from lie2hang
union
score from lie2hang
score from lie2hang
score from lie2hang
score from lie2hang;
2、insert all操作
语句如下:
create table lie2hang_result(
id number,223)">
name varchar2(20),223)">
course varchar2(20),223)">
score number
);
insert all
into lie2hang_result(id,score) values(id,chinese)
这样的结果和第一种方法的相同,不过貌似不大好像起来用这个哈!