我们将汇率存储在一个表格中,并且每周更新几次以获取最新的汇率。我正在尝试能够在销售订单上记录日期,并为其分配订单时处于活动状态的汇率。下面是汇率列表及其生效日期以及销售订单的列表示例,以及效果率应该是多少(交易率@订单时间,这是我想要的内容)。
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.evaliddate上的MAX函数,我无法想到如何引入currate.currentrate字段。然后对于t_rate.effectivedate,我只获得表周期的汇率的MAX天,而不是< = orderhed.orderdate的最大日期。我需要MAX currate.effectivedate小于或等于orderhed.orderdate,以获得在订单生效时生效的生效日期(和相应的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')
更新---
感谢@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
答案 0 :(得分: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”匹配。