contract表:合同编号 订货单位  合同总额  收款总额  理论应收总额  实际应收总额(计算列:前两列的差)
C001      AAA         300        30         100            70
C002      BBB         200        50         150            100dateSet表:合同编号 应收款项    到期时间    应收金额 
C001        定金    2006-07-02      10
C001      预付款    2006-07-03      40
C001      进度款1   2006-07-04      50
.....
C001      质保金    2007-07-05      30
C002        定金    2006-06-02      50
C002      进度款1   2006-07-04      100
C002      进度款2   2006-10-04      30
.....
C002      质保金    2007-07-05      20特别说明一下,针对dateSet表,不同的合同的应收款项各有不同(跟客户签订的付款方式是千变万化的),另外大家不用考虑款收回后的冲销应收款(我另已考虑)。计算要求:
根据dateSet表的内容计算出相应的contract表的理论应收帐款,必须让数据库自动运算,而不是用什么select sum()之类的,因为我的合同有几千个了,难道每天去运算一次几千个合同的理论应收款?dateSet表的功能:每个不同的合同根据自己的应收时间来计算自己的应收款,也可以用其它方式,只要实现功能就行。

解决方案 »

  1.   

    lz太着急了,上一贴好多人的思路时可取的我想最好用作业,每天0点执行,语句如下update contract
    set 理论应收总额=a.理论应收总额+b.当天应收总额
    from contract a,(
    select 合同编号,sum(应收金额) as 当天应收总额
    from dateSet
    where 到期时间>=convert(varchar(10),getdate(),120)
    and 到期时间<dateadd(day,1,convert(varchar(10),getdate(),120))
    group by 合同编号
    ) as b
    where a.合同编号=b.合同编号insert contract(合同编号,理论应收总额)
    select 合同编号,sum(应收金额) as 当天应收总额
    from dateSet a
    where 到期时间>=convert(varchar(10),getdate(),120)
    and 到期时间<dateadd(day,1,convert(varchar(10),getdate(),120))
    and not exists (
    select 1 from contract where 合同编号=a.合同编号
    )
    group by 合同编号
    中午吃饭了,有些问题下午再说
      

  2.   

    我想应该不必说明所有的,说明思路够了用作业保证你每天都更新数据
    以上用了两个语句主要是出于效率考虑,尽量只更新当日的数据,这样做和触发器的思路类似,必须保持数据的准确性,因为一旦某天的统计数据有错,会带到下一天,如果你的dateSet允许修改当前日期或者之前的数据,那可能需要写触发器来辅助(这个触发器有点难度)。上面语句效率不是最高的,可以考虑用临时表暂时存放当天数据,减少对原表的查询次数,是否能提高效率要看你的数据情况