最近看了些行转列的资料,但是光看语句不是很懂,希望大神们能给我讲解下行转列的原理, 最好能详细点,加上例子讲就更好了

解决方案 »

  1.   

    一般就是max+case when(decode)来实现喽。
    还有一种pivot
      

  2.   

     pivot  是11G才有的功能
      

  3.   

    行转列的原理,举个例子,有这个结果集:学生 科目 成绩
    -----------------------------
    张三 语文 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函数也可以达到这个效果
      

  4.   

    --行转列
    --数据准备
    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
      

  5.   

    最近写过一篇数据挖掘C4.5的SQL算法,有用到,有兴趣可以参考一下
    Thinking in SQL系列之四:数据挖掘C4.5决策树算法