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