求一SQL语句,急(50分)

  • 主题发起人 主题发起人 mo
  • 开始时间 开始时间
M

mo

Unregistered / Unconfirmed
GUEST, unregistred user!
我有两个表(数据库为SQL sever):
table1
客户名 结算期限
sasd 每月25号
asdf 每月26号
sa 每月27号
asf 每月28号
ss 月末前1天
DD 月末前2天
svd 月末前3天
ad 下月第1天

table2
客户名 送货日期 ...
svd 2002-03-05
asdf 2002-04-11
svd 2002-03-29
... ...

问题:设我要查客户名为svd,2002年3月份的对账数据(由table1确定了,svd三月份的对账数据的日期范
围应该是:2002-02-25 至 20002-03-28),也就是说要查table2表中,客户名为:svd,送货日期 为2002-02-25 至 20002-03-28
的记录;
那么用SQL语句怎么表示呢?
若我要求3月份所有客户的对账数据又该怎么用SQL语句表示?
可以实现吗?






 
在线等待,真的很急的
 
select .............
from table1 a , table1 b
where a.客户名=b.客户名 and (??????????????)

//????????? 处不知怎么表示了,怎么没人答了?
 
SVD
select * from t1,t2
where (t1.客户=T2.客户) AND (日期>'2002-02-25') AND (日期<'2002-03-08') AND (客户='SVD')

ALL CLIENTS
select * from t1,t2
where (t1.客户=T2.客户) AND (日期>'2002-03-01') AND (日期<'2002-03-31')
 
TO:lmtfw
1: " where (t1.客户=T2.客户) AND (日期>'2002-02-25') AND (日期<'2002-03-08') AND (客户='SVD') "
总不能让用户自己去输入'2002-02-25','2002-03-08'两个数据吧:)
2: "where (t1.客户=T2.客户) AND (日期>'2002-03-01') AND (日期<'2002-03-31') "
也是不对的,因为每个客户的"结算期限"是不同的啊
SVD 三月份的对账是:(日期>'2002-02-25') AND (日期<'2002-03-08')
但 sa 三月份的对账应该是:(日期>'2002-02-27') AND (日期<'2002-03-28') 了

各位大侠:有解吗?



 
table1
客户 结算起日期 结算止日期
svd 2002-02-25 2002-03-08
 
select * from table1 as a left join table2 as b on a.客户名=b.客户名
where a.客户名='svd' and convert(char(10),b.送货日期,111) between
'2002-02-25 ' and '2002-02-28'
所有三月份只需将日期改为2002-03-01到2002-03-30
 
我想大家都忽略了一点:
1:客户只要做输入的数据:年,月,确定客户名(或者选所有客户)
也就是说是动态查询的
2:每个客户的对账期限很可能是各不相同的
-----这就是其中难点了
我也想到过要改表结构,但nulk的方法不对的;增加字段:"结算起日期""结算止日期"是个好办法
但我认为,它的字段记录应该是一个表达式才行(也包括涵数)

不知不改表结构,行不行? 各位大侠们给个好意见吧,谢谢了

 
改table1表结构,增加一个字段,意为该客户结算的开始日期,比如“25”,表示从A月
25日-B月24日,选择月份时作个判断(>28是否有效),日期范围就出来了,请试试。
 
select * from table1 as a left join table2 as b on a.客户名=b.客户名
where a.客户名='svd' and convert(char(10),b.送货日期,111) between
'2002-02-25 ' and '2002-02-28'

最好是修改表结构~~~
 
TO:大侠们,
若改表结构的话,
但这里有个问题,就是各"结算期限"所对应的"sqlJSQ"的记录应该怎么设好呢?
(因为这跟云年,平年,大月小月都有关系的)
客户名 结算期限 sqlJSQ
sasd 每月25号 ??
asdf 每月26号 ??
sa 每月27号
asf 每月28号
ss 月末前1天
DD 月末前2天
svd 月末前3天
ad 下月第1天
我还是认为把字段"sqlJSQ"的记录值设为SQL语句表达式要好
但怎么设呢?给点方法吧
 
语句写在程序里就一句,写在表里?加个字段维护也容易呀
 
TO:hsqq
"sqlJSQ"这个字段的记录不好写啊,能给点方法吗?谢谢了
若你来写这个表的话,你会怎么样做呢?
 
客户名 结算期限 sqlJSQ
sasd 每月25号 25
asdf 每月26号 26
sa 每月27号 27
asf 每月28号 28
查询的时候取SQLJSQ的内容不就行了么,定义客户档案的时候把SQLJSQ一起给定义了不就
行了么。条件是日期大于等于本月的SQLJSQ日期并小于下个月的1号就行了。
 
客户名 结算期限 sqlJSQ
sasd 每月25号 25
asdf 每月26号 26
sa 每月27号 27
asf 每月28号 28

上面的好写;但,若写下面的(sqlJSQ 字段值)就有难度了:
客户名 结算期限 sqlJSQ
ss 月末前1天 ???
DD 月末前2天 ???
svd 月末前3天 ???
ad 下月第1天 ???

请各位大侠们继续关注,谢谢



 
是否可以用一个循环体来针对每一客户改写 SQL 语句
 
月末前一天不就是下月一号减1天么。
比如2002-02-28不就是2002-03-01减1么?
不管月末是几号,下个月第一天肯定是一号啊。
 
to mo:
lmtfw的建议我同意.但我建议再增加一个字段来表示结算日期的类型:
客户名 结算期限 sqlJSQ JSQ_kind
sasd 每月25号 25 1
asdf 每月26号 26 1
sa 每月27号 27 1
asf 每月28号 28 1
ss 月末前1天 1 2
DD 月末前2天 2 2
svd 月末前3天 3 2
ad 下月第1天 1 3
其实情况不外乎这3种。借助这些信息和case语句动态得到这月和上月的结算日期应该没有问题。
select * from t1,t2
where (t1.客户=T2.客户) AND (客户='SVD') and
AND (日期> case when jsq_kind =1 then ???
when jsq_kind =2 then ???
end)
AND (日期<case when jsq_kind =1 then ???
when jsq_kind =2 then ???
end))
???处,你用用指定的年月(以及计算出来的上月的“年月”)来得到一个日期。
建议建立一个自定义函数(sqlserver的)输入用户编码和年月,返回结算日期。
可惜你的分太少!!!!!





 
呵呵,是少了点哦,这年头想拿点分真不容易啊
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部