已有充值表和消费表,要求统计每个月的充值卡至今的消费总额。举例如下:
充值表(CZ):
卡号(cardno) 充值次数(times) 充值日期(loddate) 充值金额(lodamt)
91034567 1 2010-2-12 100
91034567 2 2010-5-21 100
91034567 3 2010-9-16 200
91045678 1 2010-3-1 200
91045678 2 2010-3-23 300
91056789 1 2010-2-19 300

消费表(XF):
卡号(cardno) 消费金额(amt) 消费日期(date)  
91034567  40.00 2010-2-15  
91034567  60.00 2010-3-26  
91034567  100.00 2010-8-11
91034567  160.00 2010-10-3   
91045678  120.00 2010-3-1  
91045678  80.00 2010-3-5  
91045678  220.00 2010-5-15  
91056789  278.00 2010-5-2  

统计2月份的数据如下:
消费总额sum(amt)= 378(40+60+278)
因为卡片可以回收,所以存在一个卡号重复使用(如91034567,第一次2月份充值后全部消费完,第二次5月份充值又使用了),请各位大侠帮助一下,怎么写这个统计语句?注意两点:
1、不是月度统计,是统计卡片从充值到当前为止的消费,但要考虑回收问题,如果回收后再次充值,则此后的消费计算在下次充值后的消费统计中
2、同一张卡片前后几次充值的金额可以不同

解决方案 »

  1.   

    我要求没这么复杂,只想得到的是一个统计脚本,或是统计语句:
    只要输入相应的月份,就可以统计这个月的充值卡的消费记录。
    select sum(amt) ...where loddate = 要统计的月份
      

  2.   

    SELECT 
    SUM(B.AMT)
    FROM CZ A,XF B
    WHERE A.CARDNO = B.CARDNO
    AND A.LODDATE <= B."DATE"
    AND NOT EXISTS(SELECT 1 FROM CZ C
        WHERE C.CARDNO= A.CARDNO AND 
        C.LODDATE <= B."DATE"
        AND C.LODDATE > A.LODDATE)
    AND TO_CHAR(LODDATE,'YYYYMM') = '201002'
      

  3.   

    加上日期限定
    给出执行计划来看一下吧

    explain plan for查看执行计划
      

  4.   

    我执行了一下,发现westneverwin比tangren的要节省60%的时间,但还是太长啊(90分钟),我在数据库中建立视图和临时表,只要2分钟就能有结果,哪位大侠还有没有更好的方法,明天就结贴