有表如下:流水号    ID    数量   类型
1001      A1     20     X
1002      A1     10     X
1003      A2     40     X 
1004      A2     20     Y
1005      A3     80     Z
1006      A3     20     Y
1007      A3     10     Y求一SQL语句欲得到如下结果:A1       30      X
A2       60      X,Y
A3       110     Y,Z

解决方案 »

  1.   

    统计那个,用sum,合并的参考如下:with tb as(  
         select 'A' grade,'XX'name from dual union all  
         select 'A','XY' from dual union all  
         select 'A','YY' from dual union all  
         select 'B','aa' from dual union all  
         select 'B','bb' from dual)  
    select grade,substr(max(sys_connect_by_path(name,';')),2) name  
    from (select grade,name,row_number() over(partition by grade order by name) rn from tb)  
    start with rn=1  
    connect by  rn= prior rn+1  and   
                connect_by_root(grade)=grade  
    group by grade;  
    --   
    GRADE NAME  
    ----- --------------------------------------------------------------------------------  
    A     XX;XY;YY  
    B     aa;bb  
    --  
    10g的实现:  
    with t as(  
         select 'A' grade,'XX'name from dual union all  
         select 'A','XY' from dual union all  
         select 'A','YY' from dual union all  
         select 'B','aa' from dual union all  
         select 'B','bb' from dual)  
    select grade,wmsys.wm_concat(name) name  
    from t  
    group by grade;  
    --  
    GRADE NAME  
    ----- --------------------------------------------------------------------------------  
    A     XX,XY,YY  
    B     aa,bb  
      

  2.   

    -- Created on 2011-11-9 by QIUDF --9i
    with tb as(  
         select 'A' grade,'XX'name from dual union all  
         select 'A','XY' from dual union all  
         select 'A','YY' from dual union all  
         select 'B','aa' from dual union all  
         select 'B','bb' from dual)  
    select grade,substr(max(sys_connect_by_path(name,';')),2) name  
    from (select grade,name,row_number() over(partition by grade order by name) rn from tb)  
    start with rn=1  
    connect by  rn= prior rn+1  and grade=prior grade
    group by grade; 
    --10g
    with t as(  
         select 'A' grade,'XX'name from dual union all  
         select 'A','XY' from dual union all  
         select 'A','YY' from dual union all  
         select 'B','aa' from dual union all  
         select 'B','bb' from dual)  
    select grade,wmsys.wm_concat(name) name  
    from t  
    group by grade;  
    result:
    A XX;XY;YY
    B aa;bb
      

  3.   

    1,2楼两位太心急了
    注意看我例子里的A3   类型合并后显示的 是 y,z  而不是 y,y,z 
    既相同的类型只显示一个,而不同类型的则合并显示并用逗号隔开
      

  4.   

    多套一层group by就好了,方向已经给你了
    with tb1 as(  
         select 'A' ID,20 qty,'X' TYPE from dual union all  
         select 'A',30,'X' from dual union all  
         select 'A',10,'Y' from dual union all  
        select 'A',10,'Z' from dual union all  
         select 'B',12,'X' from dual union all  
         select 'B',31,'Y' from dual)  
        SELECT ID,SUM(qty) qty,wm_concat(TYPE) TYPE FROM ( SELECT ID,SUM(qty) qty,TYPE FROM tb1 GROUP BY ID,TYPE ORDER BY ID, TYPE) GROUP BY ID
      

  5.   


    with a as(
    select 1001 id,'A1' type,20 value,'X' flag from dual UNION all
    select 1002,'A1',10,'X' from dual union all
    select 1003,'A2',40,'X' from dual union all 
    select 1004,'A2',20,'Y' from dual union all
    select 1005,'A3',80,'Z' from dual union all
    select 1006,'A3',20,'Y' from dual union all
    select 1007,'A3',10,'Y' from dual) 
    SELECT TYPE,SUM(VALUE),wm_concat(DISTINCT flag) FROM a GROUP BY TYPE;
      

  6.   

    -- Created on 2011-11-9 by QIUDF 
    with tb as(
     select '1001' a,'A1' b, 20 c, 'X' d from dual
     union all
                   select '1002','A1', 10 ,'X' from dual
     union all
                   select '1003','A2', 40 ,'X'   from dual
     union all
                   select '1004','A2', 20 ,'Y' from dual
     union all
                   select '1005','A3', 80 ,'Z' from dual
     union all
                   select '1006','A3', 20 ,'Y' from dual
     union all
                   select '1007','A3', 10 ,'Y' from dual
      )select b,sum(c),max(substr(sys_connect_by_path(d,','),2)) path from
    (
    select b,d,sum(c) c,row_number()over(partition by b order by b) rn from tb group by b,d) start with rn=1
     connect by rn-1 =prior rn and  b=prior b
     group by b
    --result:
    A1 30 X
    A2 60 X,Y
    A3 110 Y,Z