1 前言 在实现用户的报表过程中,用户经常会提出一个看似很合符情理的要求,但实现起来却困难重重,如下: 收款明细表<省略其它字段> 数据样式 日期 收款金额 2004.02.20 87
2004.02.20 93 2004.02.21 100 2004.02.20 50 ... 报表样式 日期 收款金额 2004.02.20 87 <Null> 93<没有值,与上一笔记录相同,日期为:2004.02.20> 2004.02.21 100 <Null> 50<没有值,与上一笔记录相同,日期为:2004.02.21> ... 2 实现思路 利用OVER函数,算出当前记录在记录集中出现的次数,假如次数大于1,则不返回NULL。 3 实例演练 --3.1 测试环境 Drop Table Test_ReRecord; create table Test_ReRecord ( BillDate Date not null, Money Number(20,4) Not Null ) / Insert Into Test_ReRecord Values ( To_Date('2004.02.20','yyyy.mm.dd') ,100); Insert Into Test_ReRecord Values ( To_Date('2004.02.20','yyyy.mm.dd') ,120); Insert Into Test_ReRecord Values ( To_Date('2004.02.20','yyyy.mm.dd') ,80); Insert Into Test_ReRecord Values ( To_Date('2004.02.21','yyyy.mm.dd') ,166); Insert Into Test_ReRecord Values ( To_Date('2004.02.21','yyyy.mm.dd') ,221); Commit; --3.2 SELECT语句讲释 SELECT DECODE(RN,1,BillDate) BillDate --假如BillDate在原始记录集中出现超过1次,则显示空值 ,Money From ( SELECT BillDate ,Money ,ROW_NUMBER() --通过OVER函数返回相同的BillDate当前出现的次数 OVER ( Partition By BillDate --根据BillDate进行分区,即碰到不同的BillDate,Row_Number就恢复从1开始计数 Order By BillDate --根据BillDate进行排序,一般配合Partition By子项使用。 ) RN FROM Test_ReRecord );
|