现有一个表如下
人员id 开始时间 结束时间 月租金 总租金
ID kssj jssj zj
1 2002-1-1 10
1 2002-2-1 20
1 2005-2-1 30
2 2002-1-1 20
2 2003-1-1 30
3 2000-1-1 5
3 2000-3-1 10
3 2001-3-1 15
3 2004-1-1 20想实现如下功能:
id为1 的人员开时间是2002-1-1,租金10;租到2月份租金变为20;再到2005-2-1租金又变为30;由于结束时间为空,想算出各个阶段总租金得先得出各个阶段的结束时间,我尝试了用游标实现,但是没有做到各位高手请帮忙!2005-2-1后没有时间的话算到当前日期。因为数据都记录在同一张表中,量特别大,所以得想个算法出来解决一下!分多步走都没有问题。
人员id 开始时间 结束时间 月租金 总租金
ID kssj jssj zj
1 2002-1-1 10
1 2002-2-1 20
1 2005-2-1 30
2 2002-1-1 20
2 2003-1-1 30
3 2000-1-1 5
3 2000-3-1 10
3 2001-3-1 15
3 2004-1-1 20想实现如下功能:
id为1 的人员开时间是2002-1-1,租金10;租到2月份租金变为20;再到2005-2-1租金又变为30;由于结束时间为空,想算出各个阶段总租金得先得出各个阶段的结束时间,我尝试了用游标实现,但是没有做到各位高手请帮忙!2005-2-1后没有时间的话算到当前日期。因为数据都记录在同一张表中,量特别大,所以得想个算法出来解决一下!分多步走都没有问题。
解决方案 »
- 如何把ORACLE数据导入到ACCESS中 帮帮忙
- 在Linus下安装oracle问题
- oracle 数据库迁移问题 据库A 里a表 到 数据库B里b表 (两表结构不同)
- oracle 触发器
- 急!急!急!如何Recover UNDO表空间数据文件——在线等待!
- 这条sql语句怎么写???急急急!!!
- 紧急求救:关于通过编程实现oracle9i自动备份/恢复的问题
- select * from topic 如果有blob字段,如何然他显示非blob字段的内容呢?
- 请教有些汉字输入到oracle8.1.7中变成了中文问号,如何处理?
- 请问如何在Oracle上通过创建Dblink连接上Sybase数据库???
- 动态查询语句
- 触发器问题
--按月算租金,如果不足1月按1月算;并且id分类汇总,最后时间默认当前时间
with test as(
select 1 id, date '2002-1-1' kssj, 10 zj from dual union all
select 1 id, date '2002-2-1' kssj, 20 zj from dual union all
select 1 id, date '2005-2-1' kssj, 30 zj from dual union all
select 2 id, date '2002-1-1' kssj, 20 zj from dual union all
select 2 id, date '2003-1-1' kssj, 30 zj from dual union all
select 3 id, date '2000-1-1' kssj, 5 zj from dual union all
select 3 id, date '2000-3-1' kssj, 10 zj from dual union all
select 3 id, date '2001-3-1' kssj, 15 zj from dual union all
select 3 id, date '2004-1-1' kssj, 20 zj from dual)
select id, sum(ceil(months_between(jssj, kssj)) * zj) total
from (select t.*,
nvl(lead(kssj) over(partition by id order by kssj),
trunc(sysdate)) jssj
from test t)
group by id;
select 1 id, date '2002-1-1' kssj, 10 zj from dual union all
select 1 id, date '2002-2-1' kssj, 20 zj from dual union all
select 1 id, date '2005-2-1' kssj, 30 zj from dual union all
select 2 id, date '2002-1-1' kssj, 20 zj from dual union all
select 2 id, date '2003-1-1' kssj, 30 zj from dual union all
select 3 id, date '2000-1-1' kssj, 5 zj from dual union all
select 3 id, date '2000-3-1' kssj, 10 zj from dual union all
select 3 id, date '2001-3-1' kssj, 15 zj from dual union all
select 3 id, date '2004-1-1' kssj, 20 zj from dual)select id, sum(zzj)
from (select tt.*,
zj * MONTHS_BETWEEN(nvl(jssj, trunc(sysdate, 'mm')), kssj) zzj
from (select bt.*,
lead(kssj) over(partition by id order by kssj) jssj
from bt) tt) ttt
group by id
ID kssj jssj zj
1 2002-1-1 2002-2-1 10
1 2002-2-1 2005-2-1 20
1 2005-2-1 sysdate 30
2 2002-1-1 2003-1-1 20
2 2003-1-1 sysdate 30
3 2000-1-1 2000-3-1 5
3 2000-3-1 2001-3-1 10
3 2001-3-1 2004-1-1 15
3 2004-1-1 sysdate 20====就是想把同一个id的时间串起来,这样好计算每一段时间的租金,而原来数据表里截止时间是没有的,都是通过程序来判定的。