看看下面的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

...全文
296 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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楼的真是强啊。看来没什么能难得到你的。
加载更多回复(12)

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧