看看下面的SQL怎么写

vanjayhsu 2008-12-16 02:46:28
现有如下两个表:
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

...全文
241 点赞 收藏 32
写回复
32 条回复
xingkongmori 2008年12月23日
用表的连接是最简单的
回复 点赞
zounf 2008年12月23日
不服不行.
回复 点赞
libolibo888 2008年12月23日
佩服佩服。
我服了。
回复 点赞
oraclelogan 2008年12月17日
[Quote=引用楼主 vanjayhsu 的帖子:]
现有如下两个表:
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 …
[/Quote]

用select ... from t left join pro_info a on a.pro_id=t.pro_id
回复 点赞
a35806 2008年12月16日
这2个表是通过什么关联的?
回复 点赞
kai333hui 2008年12月16日
you are all 高手!!
回复 点赞
jinjazz 2008年12月16日
我在那个抢分的帖子中用的是c#写的工具,因为要.net framework支持,没有上传
我把以前delphi写的一个传到资源中,你 过会儿刷新看看

http://jinjazz.download.csdn.net/
回复 点赞
wap21 2008年12月16日
mark
回复 点赞
范佩西_11 2008年12月16日
sql版块牛人真多。高人能否把你的工具给偶用用?偶对你佩服的五体投地阿
回复 点赞
jinjazz 2008年12月16日
自己写的简陋小工具...你可以参考sql版狙狙和小楼的方法,写存储过程生成测试脚本。因为我对开发语言更熟悉,所以写了应用程序,总之实用就行了。
回复 点赞
vanjayhsu 2008年12月16日
貌似还有问题,我再好好检查检查。谢谢楼上的提醒和解答。又多了一种思考的方向。
回复 点赞
范佩西_11 2008年12月16日
[Quote=引用 20 楼 jinjazz 的回复:]
引用 18 楼 linzhangs 的回复:
引用 16 楼 jinjazz 的回复:
引用 10 楼 linzhangs 的回复:
倒这个高手又来了。我才做好测试数据幸亏刷新了下。楼主又要结了!呵呵


测试数据我是自动生成的,因为sqlserver和oracle的语法比较象,只是把insert后面改一下就能直接用了。

http://topic.csdn.net/u/20081211/20/fbf981b8-0923-4393-899a-6b572061b184.html
楼上的帖子我在看。是什么工具可否给我们瞧瞧


很简单的程序…
[/Quote]我知道ue可以列复制,你那是什么工具介绍介绍,我正在看你的那帖子呢。很牛很牛。一群牛人在侃
回复 点赞
jinjazz 2008年12月16日
[Quote=引用 18 楼 linzhangs 的回复:]
引用 16 楼 jinjazz 的回复:
引用 10 楼 linzhangs 的回复:
倒这个高手又来了。我才做好测试数据幸亏刷新了下。楼主又要结了!呵呵


测试数据我是自动生成的,因为sqlserver和oracle的语法比较象,只是把insert后面改一下就能直接用了。

http://topic.csdn.net/u/20081211/20/fbf981b8-0923-4393-899a-6b572061b184.html
楼上的帖子我在看。是什么工具可否给我们瞧瞧
[/Quote]

很简单的程序,把文本

[code=BatchFile]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 [/code]

转为sql语句
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;




回复 点赞
jinjazz 2008年12月16日
[Quote=引用 17 楼 vanjayhsu 的回复:]
问下这位高人,第一句的错误在哪里?如果存在一个月付款多次的情况也对吗?
[/Quote]

结果不对,你是2月份的下次付款3月7号,我按照2月7号了。
一个月多次付款,就把最原始的明细按照月份先sum汇总一下,然后按照14楼语句的思路做查询
回复 点赞
范佩西_11 2008年12月16日
[Quote=引用 16 楼 jinjazz 的回复:]
引用 10 楼 linzhangs 的回复:
倒这个高手又来了。我才做好测试数据幸亏刷新了下。楼主又要结了!呵呵


测试数据我是自动生成的,因为sqlserver和oracle的语法比较象,只是把insert后面改一下就能直接用了。

http://topic.csdn.net/u/20081211/20/fbf981b8-0923-4393-899a-6b572061b184.html
[/Quote]楼上的帖子我在看。是什么工具可否给我们瞧瞧
回复 点赞
vanjayhsu 2008年12月16日
问下这位高人,第一句的错误在哪里?如果存在一个月付款多次的情况也对吗?
回复 点赞
jinjazz 2008年12月16日
[Quote=引用 10 楼 linzhangs 的回复:]
倒这个高手又来了。我才做好测试数据幸亏刷新了下。楼主又要结了!呵呵
[/Quote]

测试数据我是自动生成的,因为sqlserver和oracle的语法比较象,只是把insert后面改一下就能直接用了。

http://topic.csdn.net/u/20081211/20/fbf981b8-0923-4393-899a-6b572061b184.html
回复 点赞
范佩西_11 2008年12月16日
[Quote=引用 11 楼 jinjazz 的回复:]
6楼哥哥,不好意思,貌似是被我抢走的...


[/Quote]牛人阿。我以为我sql写的快。看来天外有天人外有人阿,高人的思路令人赞叹!
回复 点赞
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
*/
回复 点赞
vanjayhsu 2008年12月16日
哈哈。我晕。不过11楼的真是强啊。看来没什么能难得到你的。
回复 点赞
发动态
发帖子
Oracle 高级技术
创建于2007-09-28

2929

社区成员

1.8w+

社区内容

Oracle 高级技术相关讨论专区
社区公告
暂无公告