在报表视图中实现分类显示

王朝other·作者佚名  2008-05-31
宽屏版  字体: |||超大  

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

(

BillDateDate 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

);

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有