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