表中的数据是Name Course
zhou chinese
zhou maths
zhou english
liu georaphy
liu english
怎么写sql语句,可以select出下面的结果
Name Courses
zhou chinese; maths; english
liu georaphy; english注意,当中是用“一个分号 + 一个空格”来分割的,而不是用逗号

解决方案 »

  1.   

    wmsys.wm_concat用法查看select name,wmsys.wm_concat(course,";") courses
      from table_name
      group by name
      

  2.   

     -------------table----------
    create table t1 (
     name varchar2(10),
     course varchar2(15)
    )insert into t1 values('zhou','chinese')
    insert into t1 values('zhou','maths')
    insert into t1 values('zhou','english')
    insert into t1 values('liu','georaphy')
    insert into t1 values('liu','english')
    ---------sql statment---------  
    select name, 
       decode(substr(courses, -1),   
                  ';',   
              substr(courses, 1, length(courses) - 1),   
                  courses)   
      from (select name,   
                   max(decode(rn, 1, course, null)) || ';' ||   
                 max(decode(rn, 2, course, null)) || ';' ||   
                 max(decode(rn, 3, course, null)) courses   
              from (select name,   
                           course,   
                           row_number() over(partition by name order by course) rn   
                      from t1)   
            group by name order by name desc);  
      ---------------------result -------------------
    1 zhou chinese;english;maths
    2 liu english;georaphy 
      

  3.   

    create table t1 (
     name varchar2(10),
     course varchar2(15)
    )insert into t1 values('zhou','chinese')
    insert into t1 values('zhou','maths')
    insert into t1 values('zhou','english')
    insert into t1 values('liu','georaphy')
    insert into t1 values('liu','english')select * from t1select name, 
       decode(substr(courses, -1),   
                  ';',   
              substr(courses, 1, length(courses)-1),   
                  courses) courses  
      from (select name,   
                   max(decode(rn, 1, course, null)) || ';' ||   
                 max(decode(rn, 2, course, null)) || ';' ||   
                 max(decode(rn, 3, course, null)) courses   
              from (select name,   
                           course,   
                           row_number() over(partition by name order by course) rn   
                      from t1)   
            group by name order by name desc);
      

  4.   

    --oracle 10g
    select name,replace(wmsys.wm_concat(course),',','; ') courses
      from table_name
      group by name--oracle 9i及9i以下
    select name,
    max(replace(substr(sys_connect_by_path(course, '*'), 2),'*','; ') )
    from(
    select name,course,
    dense_rank()over(order by name) + row_number()over(order by name) rid,
    row_number() over (partition by name order by name) nid
    from table_name)
    start with nid = 1
    connect by prior rid = rid - 1
    group by name;