现在小弟又遇到一个需求了,麻烦大虾看下,谢谢!数据(测试用):
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~
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~
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
比如有7笔PDNO,那么第7笔应该在第三页,floor(7/ 4 + 1) page =2 所以这里有点欠缺再改进。
ceil(rn / 3) page