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表的功能:每个不同的合同根据自己的应收时间来计算自己的应收款,也可以用其它方式,只要实现功能就行。
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表的功能:每个不同的合同根据自己的应收时间来计算自己的应收款,也可以用其它方式,只要实现功能就行。
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 合同编号
中午吃饭了,有些问题下午再说
以上用了两个语句主要是出于效率考虑,尽量只更新当日的数据,这样做和触发器的思路类似,必须保持数据的准确性,因为一旦某天的统计数据有错,会带到下一天,如果你的dateSet允许修改当前日期或者之前的数据,那可能需要写触发器来辅助(这个触发器有点难度)。上面语句效率不是最高的,可以考虑用临时表暂时存放当天数据,减少对原表的查询次数,是否能提高效率要看你的数据情况