行转列的原理,举个例子,有这个结果集:学生 科目 成绩 ----------------------------- 张三 语文 90 张三 数学 102 张三 英语 70 李四 语文 86 李四 数学 92 李四 英语 95要得到下面的结果集: 学生 语文 数学 英语 ------------------------------------------ 张三 90 102 70 李四 86 92 95 这个就是做行转列的效果分析一下:其实就是保持学生为主属性,把语文、数学、英语各科的成绩提取到一条记录上 如果从最原始的实现,不借助封装的函数,就是用group by分组加sum和decode配合来完成select xs,sum(decode(km,'语文',cj,0)) as yw,sum(decode(km,'数学',cj,0)) as sx,sum(decode(km,'英语',cj,0)) as yy from t group by xs在11G以上版本封装了pivot函数也可以达到这个效果
--行转列 --数据准备 create table test_xz (ID varchar(20), name varchar(20) );create table test_xz1 ( ID varchar(20), course varchar(20) );insert into test_xz values('1','Alan'); insert into test_xz values('2','Anna'); insert into test_xz values('3','Nancy');insert into test_xz1 values('1','数学'); insert into test_xz1 values('1','语文'); insert into test_xz1 values('2','数学'); insert into test_xz1 values('2','语文'); insert into test_xz1 values('2','英语'); insert into test_xz1 values('3','数学'); insert into test_xz1 values('3','地理');--方法一: select t.id, t.name, listagg(t1.course,',') within group(order by t.name) as cc from test_xz t, test_xz1 t1 where t.id = t1.id group by t.id, t.name--方法二: select t.id, t.name, to_char(wm_concat(t1.course)) as cc from test_xz t, test_xz1 t1 where t.id = t1.id group by t.id, t.name
还有一种pivot
-----------------------------
张三 语文 90
张三 数学 102
张三 英语 70
李四 语文 86
李四 数学 92
李四 英语 95要得到下面的结果集:
学生 语文 数学 英语
------------------------------------------
张三 90 102 70
李四 86 92 95 这个就是做行转列的效果分析一下:其实就是保持学生为主属性,把语文、数学、英语各科的成绩提取到一条记录上
如果从最原始的实现,不借助封装的函数,就是用group by分组加sum和decode配合来完成select xs,sum(decode(km,'语文',cj,0)) as yw,sum(decode(km,'数学',cj,0)) as sx,sum(decode(km,'英语',cj,0)) as yy
from t
group by xs在11G以上版本封装了pivot函数也可以达到这个效果
--数据准备
create table test_xz
(ID varchar(20),
name varchar(20)
);create table test_xz1
(
ID varchar(20),
course varchar(20)
);insert into test_xz values('1','Alan');
insert into test_xz values('2','Anna');
insert into test_xz values('3','Nancy');insert into test_xz1 values('1','数学');
insert into test_xz1 values('1','语文');
insert into test_xz1 values('2','数学');
insert into test_xz1 values('2','语文');
insert into test_xz1 values('2','英语');
insert into test_xz1 values('3','数学');
insert into test_xz1 values('3','地理');--方法一:
select t.id, t.name, listagg(t1.course,',') within group(order by t.name) as cc
from test_xz t, test_xz1 t1
where t.id = t1.id
group by t.id, t.name--方法二:
select t.id, t.name, to_char(wm_concat(t1.course)) as cc
from test_xz t, test_xz1 t1
where t.id = t1.id
group by t.id, t.name
Thinking in SQL系列之四:数据挖掘C4.5决策树算法