2013-02-12 3 views
1

Мы храним курсы обмена в таблице, и она обновляется несколько раз в неделю по последним обменным курсам. Я пытаюсь принять дату в заказе клиента и присвоить ему обменный курс, который был активен во время заказа. Ниже приведен пример перечня обменных курсов и их эффективных дат, а также заказов на продажу, и какова должна быть ставка эффекта (скорость обмена @ время заказа, которое я хочу втянуть).MAX Date <= to Date в другой таблице

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.currentrate из-за функции MAX на currate.effectivedate. Затем для t_rate.effectivedate я получаю только MAX-день обменного курса периода таблицы, а не максимальную дату, которая равна < = orderhed.orderdate. Мне нужна MAX currate.effectivedate, которая меньше или равна порядковому заказу, чтобы получить действительную дату (и соответствующий currentrate.currentrate), который действовал во время заказа. Мне жаль, если я повторяю себя, или если это не имеет смысла. Если это не очевидно из моего грустного небольшого запроса ниже, я чрезвычайно новичок в написании запросов, поэтому любая помощь, которую я могу получить, очень ценится.

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') 

Update ---

благодаря @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 

Там это минимальное решение вашей проблемы. Вам нужно сопоставить «orderdate» с «effectivedate», который равен или ближе к нему.