有张a表,如下:
 
          a1    a2   a3      
    ---------------------------------------
         001    1     a      
         001    1     b      
         001    1     c      
         002    2     a      
         002    2     b      
         002    2     c              
         002    2     d       
打开游标时如下展现
        b1      b2     b3    b4   b5   b6  b7    b8  
     ------------------------------------------
       001      1      a      b    c
       002      2      a      b    c     d
 
如果a表中相同a1大于了6行,也只能在b表中显示6列(b3--b8),第七行或是以后的就不统计了。把a.a1的数据group写到b1中
a.a2是唯一标识,写到b.b2
a.a3写到b.b3,b.b.4....最多到b8(只写6列)
如果a.a1数据大于6行,则不统计
-----------------------------------------------------
请教各位,该怎么写?

解决方案 »

  1.   

    TRY IT..
    SQL> SELECT A1 "B1",
      2         A2 "B2",
      3         MAX(DECODE(RN,1,A3,NULL)) "B3",
      4         MAX(DECODE(RN,2,A3,NULL)) "B4",
      5         MAX(DECODE(RN,3,A3,NULL)) "B5",
      6         MAX(DECODE(RN,4,A3,NULL)) "B6",
      7         MAX(DECODE(RN,5,A3,NULL)) "B7",
      8         MAX(DECODE(RN,6,A3,NULL)) "B8"
      9    FROM (
     10          SELECT T1.*,
     11                 ROW_NUMBER() OVER(PARTITION BY A1,A2 ORDER BY A1,A2) RN
     12            FROM TABLE_NAME T1
     27         )
     28   GROUP BY A1,A2
     29   ;B1          B2 B3 B4 B5 B6 B7 B8
    --- ---------- -- -- -- -- -- --
    001          1 A  B  C        
    002          2 A  B  C  D     SQL> 
      

  2.   


    create table fee
    (
     a1 varchar2(20)
    ,a2 number
    ,a3 varchar2(20)
    );insert into fee values('001', 1, 'a');
    insert into fee values('001', 1, 'b');
    insert into fee values('001', 1, 'c');
    insert into fee values('002', 2, 'a');
    insert into fee values('002', 2, 'b');
    insert into fee values('002', 2, 'c');
    insert into fee values('002', 2, 'd');
    insert into fee values('002', 2, 'e');
    insert into fee values('002', 2, 'f');
    insert into fee values('002', 2, 'g');
    insert into fee values('002', 2, 'h');
    insert into fee values('002', 2, 'i');
    insert into fee values('002', 2, 'j');commit;select a1
      ,a2
      ,max(decode(rn, 1, a3)) b3
      ,max(decode(rn, 2, a3)) b4
      ,max(decode(rn, 3, a3)) b5
      ,max(decode(rn, 4, a3)) b6
      ,max(decode(rn, 5, a3)) b7
      ,max(decode(rn, 6, a3)) b8
      from (
    select a1
      ,a2
      ,a3
      ,dense_rank() over(partition by a1, a2 order by a3) rn
      from fee
          ) x
      group by a1, a2;
      

  3.   

    1楼快dense_rank ==> row_number  这个才对
      

  4.   


    DROP TABLE a;
    create table a( a1 varchar2(20),a2 INT,a3 varchar2(20));insert into a values('001', 1, 'a');
    insert into a values('001', 1, 'a');
    insert into a values('001', 1, 'c');
    insert into a values('002', 2, 'a');
    insert into a values('002', 2, 'b');
    insert into a values('002', 2, 'c');
    insert into a values('002', 2, 'd');
    insert into a values('002', 3, 'e');
    insert into a values('002', 3, 'f');
    insert into a values('002', 3, 'g');
    insert into a values('002', 3, 'h');
    insert into a values('002', 3, 'i');
    insert into a values('002', 3, 'j');
    insert into a values('002', 3, 'k');
    commit;SELECT A1 B1,
           A2 B2,
           MIN(DECODE(RN, 1, A3)) B3,
           MIN(DECODE(RN, 2, A3)) B4,
           MIN(DECODE(RN, 3, A3)) B5,
           MAX(DECODE(RN, 4, A3)) B6,
           MAX(DECODE(RN, 5, A3)) B7,
           MAX(DECODE(RN, 6, A3)) B8
      FROM (SELECT A1,
                   A2,
                   A3,
                   row_number() OVER(PARTITION BY A1, A2 ORDER BY A3) RN
              FROM A) X
     GROUP BY A1, A2;
    /*
    输出:
    B1 B2 B3 B4 B5 B6 B7 B8
    001 1 a a c
    002 2 a b c d
    002 3 e f g h i j
    */