当前位置导航:炫浪网>>网络学院>>编程开发>>Oracle教程

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


  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
     );
相关内容
赞助商链接