查询的逻辑分析问题。。

xiaoyuehen 2003-10-24 03:28:07
现在有个库用来保存门市(字段为DM)的停业记录,如下形式,在某段时间内停业(rq1,rq2),则加一条记录:
ID DM rq1 rq2

1 GD 1900-1-1 2001-12-31
2 GD 2002-5-26 2002-5-28
3 GD 2002-8-31 2002-8-31
4 GD 2002-11-28 2002-11-28
5 GD 2003-1-5 2003-1-7
6 GD 2003-3-25 2100-1-1

想编写一用户自定义函数,传入@rq1,@rq2两个参数,返回在此期间内开业的门市记录(可能有两种情况,1.期间内所有日期均在开业的才算 2.期间只要有开业一天的都算),应该怎么编写呢?
...全文
45 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyuehen 2003-10-27
  • 打赏
  • 举报
回复
这样子的情况。。。

顶...
xiaoyuehen 2003-10-25
  • 打赏
  • 举报
回复
我试写了语句统计第一种要求的列表
如果在某个时间段内,门市有开业记录(一天也行),则把该门市算入统计结果。例如求2002-5-1到2002-6-1这段时间,虽然GD有关店记录,但也有开业,所以要统计在内。

declare @rq1 smalldatetime
declare @rq2 smalldatetime
set @rq1 = '2002-8-27'
set @rq2 = '2002-8-28'

select distinct msdm from 表 where msdm not in(select msdm from 表 where rq1<=@rq1 and rq2>=@rq2)

帮忙看看有没有问题呀
xiaoyuehen 2003-10-25
  • 打赏
  • 举报
回复
为什么要有门市资料呢?我只需要正在营业的门市代码啊。。。

如果我们用眼睛去看这个表,应该很容易看出来 GD 在 2002-1-1 开业了,到 2002-5-25 这段时间一直是在 营业当中,但是怎么用查询语句表现出来?

假设我要查 2002-3-1(@rq1) 到 2002-4-1(@rq2) 这段时间 正在营业 的门市,那 GD 这个门市就应该被查到,被列出来。
txlicenhe 2003-10-25
  • 打赏
  • 举报
回复
问题是: 没有门市资料
xiaoyuehen 2003-10-25
  • 打赏
  • 举报
回复
现在有个库用来保存门市(字段为DM)的停业记录,如下形式,在某段时间内停业(rq1,rq2),则加一条记录:
ID DM rq1 rq2

1 GD 1900-1-1 2001-12-31
2 GD 2002-5-26 2002-5-28
3 GD 2002-8-31 2002-8-31
4 GD 2002-11-28 2002-11-28
5 GD 2003-1-5 2003-1-7
6 GD 2003-3-25 2100-1-1

想编写一查询语句,传入@rq1,@rq2两个参数,返回在此期间内开业的门市列表(可能有两种情况,1.期间内所有日期均在开业的才算 2.期间只要有开业一天的都算),应该怎么编写呢?

2003-10-24新开一家门市如BJ,就在这个表当中加一条记录

BJ 1900-1-1 2003-10-23

这样就表示这家门市开业了。也就是说,单从停业记录查出开业的状况的。
(查询时间段在程序中,会被限制在2000年到2079年)

这样如果我要查 2003-10-25 这天全国的门市营业状况,因为 BJ 没有在这天停业的记录,所以统计结果中应该包含 BJ 门市,而 GD 在这天到 2100-1-1 期间都是停业状态,所以不算在内。而将来如果 GD 又开业的话,就修改 2100-1-1 为开业的前一天,这样就算 GD 又开业了(在那以后没有停业记录)
pengdali 2003-10-24
  • 打赏
  • 举报
回复
哦,不知道楼主是不是如你所说。
xiaoyuehen 2003-10-24
  • 打赏
  • 举报
回复
回复人: pengdali(大力 V3.0) ( ) 信誉:551 2003-10-24 19:19:00 得分:0


xiaoyuehen 和 jkljf是一个人吗?


答:不是。在CSDN我只有这一个ID
xiaoyuehen 2003-10-24
  • 打赏
  • 举报
回复
这样如果我要查 2003-10-25 这天全国的门市营业状况,因为 BJ 没有在这天停业的记录,所以统计结果中应该包含 BJ 门市,而 GD 在这天到 2100-1-1 期间都是停业状态,所以不算在内。而将来如果 GD 又开业的话,就修改 2100-1-1 为开业的前一天,这样就算 GD 又开业了(在那以后没有停业记录)
pengdali 2003-10-24
  • 打赏
  • 举报
回复
xiaoyuehen 和 jkljf是一个人吗?
xiaoyuehen 2003-10-24
  • 打赏
  • 举报
回复
2003-10-24新开一家门市如BJ,就在这个表当中加一条记录

BJ 1900-1-1 2003-10-23

这样就表示这家门市开业了。也就是说,单从停业记录查出开业的状况的。
(查询时间段在程序中,会被限制在2000年到2079年)
pengdali 2003-10-24
  • 打赏
  • 举报
回复
楼主光给了门市停业表没有门市表,如果门市A没有停过业,光给这个表是查不出的。
xiaoyuehen 2003-10-24
  • 打赏
  • 举报
回复
我只要语句就行了。。写成什么形式不是很重要,主要我对这个如何统计的逻辑思路很混乱,不知道怎么写,用了好几种情况,都不符合,总是有例外的情况发生。。

Select语句如果表达?
xiaoyuehen 2003-10-24
  • 打赏
  • 举报
回复
我想要的表格很容易就说的明白,但是实现的逻辑我实在弄不懂。

我需要某段时间内开业门市的列表, 根据我们要求的不同, 可能有需要两种结果:
1.如果在某个时间段内,门市有开业记录(一天也行),则把该门市算入统计结果。例如求2002-5-1到2002-6-1这段时间,虽然GD有关店记录,但也有开业,所以要统计在内。

2.如果在某个时间段内,门市有关店记录(一天也算),则不把该门市算入统计结果。在这种情况,1中的时间段内,GD就不能显示(因有关店)。

这两种要求如何统计??
xjwxiong 2003-10-24
  • 打赏
  • 举报
回复
最好用存儲過程(SP)
函數返回Table會有一些問題
上次試過沒有成功
存儲過程可參考馬可的寫法



jkljf 2003-10-24
  • 打赏
  • 举报
回复
好像逻辑有点不对阿
jkljf 2003-10-24
  • 打赏
  • 举报
回复
只要门市列表?少选择几列不就行了

select distinct DM from tblname
where (rq1 not between @rq1 and @rq2) and (rq2 not between @rq1 and @rq2)

不知道是不是这个意思
xiaoyuehen 2003-10-24
  • 打赏
  • 举报
回复
谢谢楼上的回复。

我多写了几个字:(

我想要的是期间开业的门市列表(有那两种情况,只要帮我实现其中一种就可以了),即在此期间,有哪几家门市正在营业中。
txlicenhe 2003-10-24
  • 打赏
  • 举报
回复
Try:
1:
Create function test1(@rq1,@rq2)
returns table
As
Return
Select * from tableName
where rq1 not between @rq1 and @rq2
and rq2 not between @rq1 and @rq2
go

2:
Create function test2(@rq1,@rq2)
returns table
As
Return
Select * from tableName
where not(@rq1 between rq1 and rq2 and @rq2 between rq1 and rq2)
go

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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