| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1099 人关注过本帖
标题:一个比较难的算法
只看楼主 加入收藏
jerryzhao
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2006-5-29
收藏
 问题点数:0 回复次数:26 
一个比较难的算法

现在有表1
odate sdate edate
2006-1-2 2006-1-1 2006-1-2
2006-1-5 2006-1-1 2006-1-5
2006-1-7 2006-1-1 2006-1-7
2006-1-8 2006-1-1 2006-1-8
2006-2-1 2006-1-28 2006-2-1
2006-2-2 2006-1-28 2006-2-2
*********
表2
odate qty
2006-1-2 20
2006-1-5 40
2006-1-7 50
2006-1-8 30
2006-2-1 30
2006-2-2 20
*******************
现在要实现 如下
odate qty tqty
2006-1-2 20 20
2006-1-5 40 20+40=60
2006-1-7 50 20+40+50=110
2006-1-8 30 20+40+50+30=140
2006-2-1 30 30
2006-2-2 20 30+20=50
**********
也就是判断表2中的odate是表1中对应odate的sdate和edate范围,然后把表2中sdate和edate时间内qty的数量求和作为tqty,这该如何实现???

搜索更多相关主题的帖子: 算法 
2006-05-30 18:17
LouisXIV
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:789
专家分:0
注 册:2006-1-5
收藏
得分:0 

begin tran

create table #temp1
(
odate datetime,
sdate datetime,
edate datetime
)

insert into #temp1
select
'2006-1-2','2006-1-1','2006-1-2'
union
select
'2006-1-5','2006-1-1','2006-1-5'
union
select
'2006-1-7','2006-1-1','2006-1-7'
union
select
'2006-1-8','2006-1-1','2006-1-8'
union
select
'2006-2-1','2006-1-28','2006-2-1'
union
select
'2006-2-2','2006-1-28','2006-2-2'


create table #temp2
(
odate datetime,
qty int
)

insert into #temp2
select
'2006-1-2',20
union
select
'2006-1-5',40
union
select
'2006-1-7',50
union
select
'2006-1-8',30
union
select
'2006-2-1',30
union
select
'2006-2-2',20

select *
from #temp1

select *
from #temp2

select odate,
(
select sum(qty)
from #temp2
where odate between
(
select sdate from #temp1
where a.odate=#temp1.odate
)
and
(
select edate from #temp1
where a.odate=#temp1.odate
)
) as tqty
from #temp1 a

rollback tran

前面都是测试数据的准备,参看最后一个查询


2006-05-30 19:45
jerryzhao
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2006-5-29
收藏
得分:0 
斑竹大哥,我用你的查询试过,怎么算出来的全是190呢? 没有达到我要的效果阿,麻烦再帮忙看看?
2006-05-31 11:51
LouisXIV
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:789
专家分:0
注 册:2006-1-5
收藏
得分:0 
你把2楼的全复制进去试了?

子查询的表名规制如果写错的话得不到正确结果的

2006-05-31 11:57
jerryzhao
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2006-5-29
收藏
得分:0 

晕~~ 全复制就可以用,可是where a.odate=#temp1.odate
where a.odate=#temp1.odate
from #temp1 a
这三句我看不懂啊?a是哪里来的阿?from #temp1 a
这个怎么理解呢?我新手,不懂啊
麻烦你解说一下,谢谢

2006-05-31 12:04
LouisXIV
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:789
专家分:0
注 册:2006-1-5
收藏
得分:0 
a只是给表#temp1起了个别名而已

至于嵌套子查询的写法应该是你自己去学的

2006-05-31 12:13
jerryzhao
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2006-5-29
收藏
得分:0 
你的嵌套查询我能看懂,可是我没有看到你在什么地方起的这个别名阿?还有from #temp1 a 中间不需要逗号吗?
2006-05-31 12:23
LouisXIV
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:789
专家分:0
注 册:2006-1-5
收藏
得分:0 
from #temp1 a

就是起别名

2006-05-31 12:25
jerryzhao
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2006-5-29
收藏
得分:0 
吐血~~~ 大哥你不是耍人吗,那你的a就是代表 #temp1了?那
where a.odate=#temp1.odate
where a.odate=#temp1.odate
又是什么意思呢?
另外如果出现下面的错误怎么解决呢?
“子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。”
2006-05-31 12:37
LouisXIV
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:789
专家分:0
注 册:2006-1-5
收藏
得分:0 
你没有理解嵌套子查询的写法之前,这个问题很难跟你说明白

简单来说,a所代表的是查询主体的#temp1, 等号后面的是子查询内的#temp1,两个表是不同意义的。能不能理解就是你自己的问题了

至于你说的第二个问题,不看到语句无法分析(部分场合还要参考库内数据)。

2006-05-31 12:44
快速回复:一个比较难的算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016419 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved