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