现将SQL简化成从以下三表中求:
A表:nf(年份),yf(月份),qsrq(起始日期),zzrq(终止日期)
B表:nf(年份),yf(月份),wlbh(物料编号),wldj(物料单价)
C表:wlbh(物料编号),czrq(操作日期)
对应关系是:B表中的nf和yf对应于A表,但是有可能A表中的nf和yf在B表中不存在。
现想组织一SQL:根据C表中的czrq来求出其在B表中的wldj(物料单价)。
需要注意的一点是C表的czrq应在A表的rsrq和zzrq之间,而且,A表中的nf和yf如果在B表中不存在,则取B表中最接近A表nf和yf的物料单价。多谢各位,在线等待,不太清楚的还望再与我交流。
A表:nf(年份),yf(月份),qsrq(起始日期),zzrq(终止日期)
B表:nf(年份),yf(月份),wlbh(物料编号),wldj(物料单价)
C表:wlbh(物料编号),czrq(操作日期)
对应关系是:B表中的nf和yf对应于A表,但是有可能A表中的nf和yf在B表中不存在。
现想组织一SQL:根据C表中的czrq来求出其在B表中的wldj(物料单价)。
需要注意的一点是C表的czrq应在A表的rsrq和zzrq之间,而且,A表中的nf和yf如果在B表中不存在,则取B表中最接近A表nf和yf的物料单价。多谢各位,在线等待,不太清楚的还望再与我交流。
表是没问题的。
A表相当于财政周期表。
B表是到了一定的时间后根据A表中的nf和yf来生成的物料单价信息。
where c.czrq=...
and c.czrq>=a.qsrq and c.czrq<=a.zzrq
and c.wlbh=b.wlbh
and ABS((b.nf*12+b.yf)-(a.nf*12+a.yf))=
(select min(ABS((b.nf*12+b.yf)-(a.nf*12+a.yf))) from a,b)
也就是取单价时首先关联到A表,得出nf和yf后再从B表中看是否有相关的nf和yf,若没有则取最接近的nf和yf的物料单价。
where c.wlbh=b.wlbh
and c.czrq>=a.qsrq and c.czrq<=a.zzrq
and min(datediff(cast(a.nf+a.yf+'01' as datetime),cast(b.nf+b.yf+'01' as datetime)))
min(abs(...))
where c.wlbh=b.wlbh
and c.czrq>=a.qsrq and c.czrq<=a.zzrq
and min(abs(datediff(cast(''''+a.nf+a.yf+'01''' as datetime),cast(''''+b.nf+b.yf+'01''' as datetime))))
能把你的思想叙述一下吗?Min在此可以用吗?
我在SQL server2000里运行通不过。
你好,下面的还不行!
select b.wldj from a,b,c
where c.czrq=...
and c.czrq>=a.qsrq and c.czrq<=a.zzrq
and c.wlbh=b.wlbh
and ABS((b.nf*12+b.yf)-(a.nf*12+a.yf))=
(select min(ABS((b.nf*12+b.yf)-(a.nf*12+a.yf))) from a,b)
其中最后一行,从临时表中取得的两表年份月份之差并没有指定具体的物料。
select b.wldj from a,b,c,
(select min(ABS((b.nf*12+b.yf)-(a.nf*12+a.yf))) as MinDT,b.wlbh
from a,b group by b.wlbh) d
where c.czrq=...
and c.czrq>=a.qsrq and c.czrq<=a.zzrq
and c.wlbh=d.wlbh
and ABS((b.nf*12+b.yf)-(a.nf*12+a.yf))=d.MinDT
select b.wldj from a,b,c,
(select min(ABS((b.nf*12+b.yf)-(a.nf*12+a.yf))) as MinDT,b.wlbh
from a,b group by b.wlbh) d
where c.czrq=...
and c.czrq>=a.qsrq and c.czrq<=a.zzrq
and c.wlbh=b.wlbh
and c.wlbh=d.wlbh
and ABS((b.nf*12+b.yf)-(a.nf*12+a.yf))=d.MinDT
with temp as (select min((a.nf*12+a.yf)-(b.nf*12+b.yf)) as MinDT,
b.wlbh,a.nf,a.yf
from a,b where group by a.nf,a.yf,b.wlbh)
select c.wldj from a,b,c
where b.wlbh=c.wlbh and c.zdrq>=a.qsrq
and c.zdrq<=a.zzrq and a.nf=temp.nf and a.yf=temp.yf
and b.wlbh=temp.wlbh and (a.nf*12+a.yf)-(b.nf*12+yf)=MinDT
当然最好用left join
多谢各位!