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
);