2013-02-12 3 views
1

환율은 테이블에 저장되며 최신 환율로 일주일에 몇 번 업데이트됩니다. 판매 주문서에 날짜를 기입하고 주문 당시 활성 상태였던 환율을 할당하려고합니다. 아래는 환율 및 유효 일자, 판매 주문 목록, 효과 비율 (주문 시간당 Exchage rate, 내가 원하는 것)입니다.MAX 날짜 <= 다른 테이블의 날짜

currate.effectivedate  currate.currentrate 
12/2/2012     0.55 
12/7/2012     0.52 
12/13/2012     0.54 
12/19/2012     0.53 
12/22/2012     0.56 

orderhed.orderdate  orderhed.ordernum  Exchage Rate @ date of order 
12/4/2012     105     0.55 
12/8/2012     111     0.52 
12/9/2012     116     0.52 
12/19/2012     120     0.53 
12/28/2012     123     0.56 

다음과 같은 예가 있습니다.하지만 작동하지 않습니다. 첫째, currate.effectivedate의 MAX 기능 때문에 currate.currentrate 필드를 가져 오는 방법을 생각할 수 없습니다. 그런 다음 t_rate.effectivedate에 대해 최대 기간이 < = orderhed.orderdate가 아닌 테이블 기간의 환율의 최대 일을 얻고 있습니다. order의 유효 기간 (및 해당 currentrate.currentrate)을 얻으려면 orderhed.orderdate보다 작거나 같은 MAX currate.effectivedate가 필요합니다. 내가 나 자신을 되풀이하거나 미안하다면 미안하다. 아래의 슬픈 질문에 분명하지 않다면 필자는 쿼리를 작성하는 데있어 극히 익숙하므로 어떤 도움을받을 수 있는지 크게 알고 있습니다.

SELECT  
orderhed.ordernum, 
orderhed.orderdate, 
orderdtl.orderline, 
orderdtl.unitprice, 
orderdtl.docunitprice, 
orderdtl.discount, 
orderdtl.docdiscount, 
t_rate.effectivedate 

FROM   orderhed LEFT OUTER JOIN 

(SELECT  rate1.company, MAX(rate1.effectivedate) AS effectivedate, order1.orderdate 
FROM   currrate as rate1 INNER JOIN 
        orderhed AS order1 ON rate1.company = order1.company 
WHERE  (rate1.company = 'lotcol') AND (rate1.currencycode = 'usd') 
GROUP BY rate1.company, order1.orderdate) 

AS t_rate ON orderhed.company = t_rate.company AND t_rate.orderdate <= orderhed.orderdate 
         INNER JOIN 
        orderdtl ON orderhed.company = orderdtl.company 
WHERE  (orderhed.company = 'lotcol') 

업데이트 --- 당신이 올바른 방향으로 날을 슬쩍 찔렀다 무엇 대답 @LastCoder

감사합니다. 하루의 끝에서,이 일을 정확히 :

SELECT  orderhed.ordernum, orderhed.orderdate, orderdtl.orderline, orderdtl.unitprice, orderdtl.docunitprice, orderdtl.discount, orderdtl.docdiscount, t_rate.effectivedate, 
        t_rate.ordernum AS Expr1, t_rate1.currentrate 
FROM   orderhed INNER JOIN 
         (SELECT  rate1.company, MAX(rate1.effectivedate) AS effectivedate, order1.orderdate, order1.ordernum 
         FROM   currrate AS rate1 INNER JOIN 
               orderhed AS order1 ON rate1.company = order1.company AND rate1.effectivedate <= order1.orderdate 
         WHERE  (rate1.company = 'lotcol') AND (rate1.currencycode = 'usd') 
         GROUP BY rate1.company, order1.orderdate, order1.ordernum) AS t_rate ON orderhed.ordernum = t_rate.ordernum AND orderhed.company = t_rate.company AND 
        t_rate.orderdate <= orderhed.orderdate INNER JOIN 
         (SELECT  company, currencycode, effectivedate, currentrate 
         FROM   currrate AS currrate_1 
         WHERE  (company = 'lotcol') AND (currencycode = 'usd')) AS t_rate1 ON t_rate.company = t_rate1.company AND 
        t_rate.effectivedate = t_rate1.effectivedate INNER JOIN 
        orderdtl ON orderhed.company = orderdtl.company AND orderhed.ordernum = orderdtl.ordernum 
WHERE  (orderhed.company = 'lotcol') 
ORDER BY orderhed.ordernum 

답변

1
SELECT o.orderdate 
    , ISNULL(r.effectivedate, (
     SELECT MAX(effectivedate) FROM t_rate WHERE effectivedate < o.orderdate 
    ) 
FROM orderhed o 
LEFT JOIN t_rate r ON o.orderdate = r.effectivedate 

문제에 대한 최소한의 솔루션이있다. "주문 일자"를 그와 같거나 그보다 작은 "유효 기간"과 일치시켜야합니다.

관련 문제