1

為替レートはテーブルに保存され、最新の為替レートに合わせて週に数回更新されます。受注の日付を取得し、注文時に有効だった為替レートを割り当てられるようにしようとしています。以下は、為替レートとその発効日、および販売注文のリストの例であり、効果レートはどうあるべきか(為替レート@注文時間、これは私が引き出したいものです)です。

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の場合、テーブル期間の為替レートのMAX日だけを取得し、<=orderhed.orderdateである最大日は取得しません。注文時に有効だった発効日(および対応するcurrentrate.currentrate)を取得するには、orderhed.orderdate以下のMAXcurrate.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
4

1 に答える 1

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

あなたの問題には最小限の解決策があります。「注文日」を「発効日」と同じかそれよりも小さい「発効日」に一致させる必要があります。

于 2013-02-12T17:05:36.183 に答える