【发布时间】:2011-07-27 09:41:31
【问题描述】:
我有一张 ExchangeRates 表,其中包含一个 countryid 和一个 exchangerateate 的东西:
ExchangeRateID Country ToUSD ExchangeRateDate
1 Euro .7400 2/14/2011
2 JAP 80.1900 2/14/2011
3 Euro .7700 7/20/2011
请注意,同一国家/地区可能会根据日期使用不同的汇率...例如,上面的欧元是 2011 年 2 月 14 日的 0.7400,现在是 2011 年 7 月 20 日的 0.7700。
我有另一个订单项表,用于根据国家/地区列出项目。在此表中,每个订单项都有一个与之关联的日期。行项目日期应使用基于汇率的相应日期和国家。因此,如果我在 2011 年 2 月 16 日有一个带有国家欧元的订单项,则使用上述数据,它应该使用 2011 年 2 月 14 日的欧元值,而不是 2011 年 7 月 20 日的值,因为日期(条件 er. ExchangeRateDate
SELECT
er.ExchangeRateID,
er.CountryID AS Expr1,
er.ExchangeRateDate,
er.ToUSD,
erli.ExpenseReportLineItemID,
erli.ExpenseReportID,
erli.LineItemDate
FROM
dbo.ExpenseReportLineItem AS erli
LEFT JOIN
dbo.ExchangeRate AS er
ON er.CountryID = erli.CountryID
AND DATEADD(d, DATEDIFF(d, 0, er.ExchangeRateDate), 0) <= DATEADD(d, DATEDIFF(d, 0,
erli.LineItemDate), 0)
WHERE (erli.ExpenseReportID = 196)
这个左连接的问题...是因为日期是
LineItem 表有多条记录,每条记录都可以有自己的 CountryID:
Item Country ParentID LineItemDate
Line Item 1 Euro 1 2/14/2011
Line Item 2 US 1 2/14/2011
Line Item3 Euro 1 2/15/2011
所以 ParentID (ExpenseReportID) = 1 有 3 条记录。然后我获取这些记录并加入 ExchangeRate 表,其中我的行项目表中的 Country = 汇率表的国家/地区(这部分很简单)但是我要做的第二个条件是:
AND DATEADD(d, DATEDIFF(d, 0, er.ExchangeRateDate), 0) <= DATEADD(d, DATEDIFF(d, 0,
erli.LineItemDate), 0)
但这就是问题所在,因为这将返回我的汇率表中的多行,因为欧元被列出了两次。
【问题讨论】:
-
我在这里为 t-sql 专家祈祷......
标签: sql-server-2005 tsql