Chinaunix首页 | 论坛 | 博客
  • 博客访问: 771985
  • 博文数量: 803
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 5015
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-28 10:29
文章分类

全部博文(803)

文章存档

2011年(1)

2008年(802)

我的朋友

分类:

2008-10-29 11:37:56


  1 前言 
  在实现用户的报表过程中,用户经常会提出一个看似很合符情理的要求,但实现起来却困难重重,如下:
  收款明细表<省略其它字段>
  
  数据样式
  日期    收款金额
  2004.02.20  87
  2004.02.20  93
  2004.02.21  100
  2004.02.20  50
  ...
  
  报表样式
  日期    收款金额
  2004.02.20  87
      93<没有值,与上一笔记录相同,日期为:2004.02.20>
  2004.02.21  100
      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
     );
【责编:admin】

--------------------next---------------------

阅读(396) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~