现将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的物料单价。多谢各位,在线等待,不太清楚的还望再与我交流。

解决方案 »

  1.   

    c表的操作日期和ab表什么关系
      

  2.   

    To 楼上:
    表是没问题的。
    A表相当于财政周期表。
    B表是到了一定的时间后根据A表中的nf和yf来生成的物料单价信息。
      

  3.   

    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)
      

  4.   

    C表的操作日期是要和A表中的qsrq(起始日期)和zzrq(终止日期)关联。
    也就是取单价时首先关联到A表,得出nf和yf后再从B表中看是否有相关的nf和yf,若没有则取最接近的nf和yf的物料单价。
      

  5.   

    select b.wldj from a,b,c
    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)))
      

  6.   

    min部分加绝对值abs
    min(abs(...))
      

  7.   

    select b.wldj from a,b,c
    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))))
      

  8.   

    TO: esu(ESU) 
    能把你的思想叙述一下吗?Min在此可以用吗?
      

  9.   

    to esu(ESU) :你那条语句是运行在哪个SQL里面可以通过? 
    我在SQL server2000里运行通不过。
      

  10.   

    TO: heixiu1980(heixiu1980)
    你好,下面的还不行!
    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)
    其中最后一行,从临时表中取得的两表年份月份之差并没有指定具体的物料。
      

  11.   

    那试试这个:
    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
      

  12.   

    错了,是这样:
    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
      

  13.   

    差不多,只是DB2里的求绝对值时用ABS怎么都返回零,郁闷...
      

  14.   

    正解基本是这样的:(绝对值可以不要了,a的nf和yf总要大于b的nf和yf)
    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
    多谢各位!