【问题标题】:Use last available currency rate by date available to calculate totals使用可用日期的最后可用货币汇率来计算总计
【发布时间】:2015-03-06 16:10:51
【问题描述】:

我正在尝试转换订单的货币汇率。 货币汇率表在该特定日期每天更新,但是可以在当天早些时候创建订单,因此汇率不会反映在当前查询中。如果当天的货币汇率不存在,我将如何添加案例语句并修改查询,使用最后一个可用的货币日期(在表中)。

@Curr 是所需的货币代码。可能是“美元”、“英镑”等。

SELECT OrderNumber
  ,(CASE WHEN @Curr<>cur.code THEN 
    o.price * (SELECT Rate FROM xchangeRates xr 
                WHERE xr.FromCurrCode = c.Code 
                AND xr.ToCurrCode = @Curr 
                AND xr.Date= ISNULL((SELECT TOP 1 CAST(Crtd_DateTime AS Date) FROM ApDoc apdoc 
                                        WHERE apdoc.PONbr = o.OrderNumber AND apdoc.PONbr>'' 
                                        ORDER BY apdoc.Crtd_DateTime DESC),o.orderdate)
               )
    ELSE o.price
END ) as o.price
from orders o
join currency c on c.curcode = o.curcode

【问题讨论】:

  • 为什么是CASE?为什么不是返回按日期 DESC 排序的前 1 个货币汇率的子查询?
  • 或子查询....但是如果当前汇率不可用,我将如何使用它。

标签: sql sql-server sql-server-2008


【解决方案1】:

为什么不这样:

...
 o.price * (SELECT TOP 1 Rate FROM xchangeRates xr 
                WHERE xr.FromCurrCode = c.Code 
                AND xr.ToCurrCode = @Curr 
                ORDER BY xr.Date DESC)
...

如果 xchangeRates 表中有未来日期,您只需在 WHERE 子句中添加一个额外的过滤器,以将 xr.Date 限制为

编辑:处理这个要求:

如果发票是在 apdoc 中创建的,则它使用该日期作为 汇率,但如果不是,则使用订单创建日期。

忘记您对 apDoc 的子选择,而是将其加入外部查询中的订单:

LEFT OUTER JOIN apDoc 
ON apdoc.PONbr = o.OrderNumber 

然后为您的子查询执行此操作,而不是我上面的内容:

 o.price * (SELECT TOP 1 Rate FROM xchangeRates xr 
                WHERE xr.FromCurrCode = c.Code 
                AND xr.ToCurrCode = @Curr
                AND xr.Date =< COALESCE(CAST(apdoc.Crtd_DateTime AS Date),o.OrderDate)
                ORDER BY xr.Date DESC)

nb:我将 Crtd_DateTime AS Date 转换为日期,因为您在代码中执行了此操作,而且据我所知,它是一个 varchar,但如果它是 Datetime 数据类型,则在我的解决方案中不需要转换。

【讨论】:

  • 我认为这行不通...因为原始查询还查看另一个表,如果发票是在 apdoc 中创建的,则它使用该日期作为汇率,但如果不是那么它使用创建订单的日期。但除此之外:我需要添加一些内容,例如子查询使用 orderdate 并且 orderdate 不会在货币汇率表中退出,然后它使用最后一个可用的货币日期。
  • 好的,我的子查询已经处理了第二个要求:“子查询使用 orderdate 并且 orderdate 没有在货币汇率表中退出,然后它使用最后一个可用的货币日期”,我将编辑我的回答向您展示如何加入 apDoc 和 Order 来处理您的第一个需求。
  • 我刚刚完善了查询。我相信会是这样。否则请告诉我。
  • 您需要在问题中而不是在我的回答中编辑查询。
  • 这也行不通...因为单个 PO 的 apdoc 也有多个创建日期。在这种情况下,我选择与采购订单相关的最后一张发票创建日期。
猜你喜欢
  • 2020-10-01
  • 2011-01-26
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多