看看下面的SQL怎么写,哪样最简单?

vanjayhsu 2008-12-16 02:53:17
现有如下两个表:
select * from pro_info
项目ID 项目开始日期 项目结束日期 下次付款日期 下次付款金额
pro_id pro_begin_time pro_end_time next_pay_day next_pay_money
A 20080101 20080601 20080207 100
A 20080101 20080601 20080307 200
A 20080101 20080601 20080607 300

select * from t

月份 项目ID 已收金额
200801 A
200802 A 100
200803 A 300
200804 A 300
200805 A 300
200806 A 600

希望通过上述两个表的关联,得到如下结果。请高手赐教。谢谢!
SQL?
月份 项目ID 已收金额 下次付款日期 下次付款金额
200801 A 20080207 100
200802 A 100 20080307 200
200803 A 300 20080607 300
200804 A 300 20080607 300
200805 A 300 20080607 300
200806 A 600
...全文
90 点赞 收藏 3
写回复
3 条回复
jinjazz 2008年12月16日
1楼的有些问题,没有完全符合需要,改2楼的
回复 点赞
jinjazz 2008年12月16日
--建立测试环境
create table pro_info (pro_id varchar(20),pro_begin_time varchar(20),
pro_end_time varchar(20),next_pay_day varchar(20),next_pay_money int);
insert into pro_info select 'A','20080101','20080601','20080207','100' from dual;
insert into pro_info select 'A','20080101','20080601','20080307','200' from dual;
insert into pro_info select 'A','20080101','20080601','20080607','300' from dual;

create table t(月份 varchar(20),项目ID varchar(20),已收金额 int);
insert into t select '200801','A',null from dual;
insert into t select '200802','A','100' from dual;
insert into t select '200803','A','300' from dual;
insert into t select '200804','A','300' from dual;
insert into t select '200805','A','300' from dual;
insert into t select '200806','A','600' from dual;

--测试语句
select 月份,项目ID,已收金额,next_pay_day,next_pay_money from(
select t.*,a.* ,row_number() over(partition by 月份,项目ID order by next_pay_day) as rn
from t left join pro_info a on a.next_pay_day>t.月份 and a.next_pay_day not like t.月份||'%'
order by t.月份)b
where b.rn=1;

--删除测试环境
--drop table pro_info;
--drop table t;

/*--测试结果
月份 项目ID 已收金额 NEXT_PAY_DAY NEXT_PAY_MONEY
200801 A 20080207 100
200802 A 100 20080307 200
200803 A 300 20080607 300
200804 A 300 20080607 300
200805 A 300 20080607 300
200806 A 600
*/
回复 点赞
jinjazz 2008年12月16日
--建立测试环境
create table pro_info (pro_id varchar(20),pro_begin_time varchar(20),
pro_end_time varchar(20),next_pay_day varchar(20),next_pay_money int);
insert into pro_info select 'A','20080101','20080601','20080207','100' from dual;
insert into pro_info select 'A','20080101','20080601','20080307','200' from dual;
insert into pro_info select 'A','20080101','20080601','20080607','300' from dual;

create table t(月份 varchar(20),项目ID varchar(20),已收金额 int);
insert into t select '200801','A',null from dual;
insert into t select '200802','A','100' from dual;
insert into t select '200803','A','300' from dual;
insert into t select '200804','A','300' from dual;
insert into t select '200805','A','300' from dual;
insert into t select '200806','A','600' from dual;

--测试语句
select 月份,项目ID,已收金额,next_pay_day,next_pay_money from(
select t.*,a.* ,row_number() over(partition by 月份,项目ID order by next_pay_day) as rn
from t,pro_info a where a.next_pay_day>t.月份
order by t.月份)b
where b.rn=1;

--删除测试环境
--drop table pro_info;
--drop table t;

/*--测试结果
月份 项目ID 已收金额 NEXT_PAY_DAY NEXT_PAY_MONEY
200801 A 20080207 100
200802 A 100 20080207 100
200803 A 300 20080307 200
200804 A 300 20080607 300
200805 A 300 20080607 300
200806 A 600 20080607 300
*/
回复 点赞
发动态
发帖子
基础和管理
创建于2007-09-28

7175

社区成员

9.5w+

社区内容

Oracle 基础和管理
社区公告
暂无公告