现在小弟又遇到一个需求了,麻烦大虾看下,谢谢!数据(测试用):
create table dkga(omno varchar2(8), pdno varchar2(20) );
insert into dkga values('pabcd001','xxxabc1');
insert into dkga values('pabcd002','xxxabc2');
insert into dkga values('pabcd003','xxxabc3');
insert into dkga values('pabcd004','xxxabc4');
insert into dkga values('poxyz001','xyz1');
insert into dkga values('poxyz002','xyz2');
insert into dkga values('poxyz003','xyz3');
insert into dkga values('hahah001','hahaha1');
insert into dkga values('hahah002','hahaha2');
insert into dkga values('hahah003','hahaha3');
insert into dkga values('hahah004','hahaha4');
insert into dkga values('hahah005','hahaha5');

。现在的需求是这样的,主要是出报表,一张报表上将SUB(OMN0,1,5)相同的资料分组显示出来,由于实际的需求更复杂,
也就是说我现在的报表上只有3个栏位显示PDNO,若OMNO相同的资料多于3笔,那么需求在下一页显示以上面的数据为例,具体来说
我要得到的数据时这样的:pg     omno       pdno_1      pdno_2       pdno_3
-----------------------------------------------------
1      pabcd      xxxabc1     xxxabc2      xxxabc3
2      pabcd      xxxabc4
1      poxyz      xyz1        xyz2         xyz3
1      hahah      hahaha1     hahaha2      hahaha3
2      hahah      hahaha4     hahaha5      hahaha6
3      hahah      hahaha7
....
....
说明: 
上面结果的pg表示“页次”,由于我报表上只能放3个PDNO,所以多于3笔的要跳页显示,我增加PG的目的也就是报表页次依据
现在主要的问题在于:
1、sub(omno,1,5)相同的资料笔数不确定,需要动态来决定页次
2、我得到上面的结果为一张表,根据DKGA动态创建的表
 
不知道我说明白没有说的简单点就是:
原来dkga表只有两个栏位omno和pdno,现在要根据sub(omno,1,5)来分组,动态进行行列转换成新的dkga表,只是新的dkga表多了pg,pdno_1,pdno_2,pdno_3几个栏位而已。且sub(omno,1,5)相同的Pdno多于3笔的要是新的一行,也就是我多加了一个栏位页次pg此需求我今天想了几个小时,打算晚上回去再想想,肯定是要写procedures的。希望大虾能给我点指示!3Q大家不要给我说“狂狼”兄写过的那个procedure哈,因为我看那个还不能实现这样的需求。不过狂狼 很厉害的  希望得到他的指点哦 O(∩_∩)O~

解决方案 »

  1.   

    SELECT omno,
           page,
           MAX(decode(rn, 1, pdno)) pdno1,
           MAX(decode(rn, 2, pdno)) pdno2,
           MAX(decode(rn, 3, pdno)) pdno3
      FROM (SELECT MOD(rn - 1, 3) + 1 rn, floor(rn / 4 + 1) page, omno, pdno
              FROM (SELECT row_number() over(PARTITION BY substr(t.omno, 1, 5) ORDER BY t.pdno) rn,
                           substr(t.omno, 1, 5) omno,
                           pdno
                      FROM dkga t))
     GROUP BY omno, page
     ORDER BY omno, page
      

  2.   

    兄弟 你的floor(rn / 4 + 1) page  这样去控制页次 是不对的!   有可能导致 你页次错乱
    比如有7笔PDNO,那么第7笔应该在第三页,floor(7/ 4 + 1) page =2  所以这里有点欠缺再改进。
      

  3.   

    这样改 应该是你此方案能解决的
    ceil(rn / 3) page