0

这是指我之前的帖子:链接

系统:SQL Server 2012

使用此脚本,如果 CutoffDate 的日期是星期六或星期日,我将采用星期五的值。

SELECT DISTINCT dbo.ECB.Currency + '-' + CAST(dbo.myTable.CutoffDate AS varchar(30)) AS ComboCurrDate, dbo.ECB.Rate AS ECBrate
FROM         dbo.ECB INNER JOIN
                      dbo.myTable ON dbo.ECB.Date = CASE WHEN datepart(weekday, dbo.myTable.CutoffDate) IN (6, 7) THEN dateadd(d, - ((datepart(weekday, 
                      dbo.myTable.CutoffDate) + 1 + @@DATEFIRST) % 7), dbo.myTable.CutoffDate) ELSE dbo.myTable.CutoffDate END AND 
                      dbo.ECB.Currency = dbo.myTable.InvoiceCurrency
WHERE     (dbo.myTable.InvoiceCurrency NOT LIKE 'EUR%')

但现在我需要重写它来处理假期。或者更好的是,处理 ECB 表中不存在的记录。

例如:对于 3 月 29 日星期五,ECB 表中没有记录,但 myTable.CutoffDate 设置为此日期。使用上面的脚本,我没有得到这一天的值。

我现在如何将 28 日的 ECB 值分配给 CutoffDate?

一般来说:如果 ECB 表中没有一天的记录,则尝试 ECB 表中的前一个日期,依此类推。

希望我能清楚地解释这一点。

感谢您的帮助。

4

3 回答 3

1

我认为您应该获取数据中每个截止日期的最新欧洲央行日期。

以下作为相关子查询执行此操作:

SELECT DISTINCT ECB.Currency + '-' + CAST(m.CutoffDate AS varchar(30)) AS ComboCurrDate,
                ECB.Rate AS ECBrate
FROM (select m.*,
             (select     top     1     ecb.date
              from ecb
               where ecb.currency = m.InvoiceCurrency and ecb.date <= m.CutoffDate
               order by ecb.date desc
             ) as ECBDateToUse
      from mytable
     ) m left outer join
     ECB 
     ON ECB.Date = m.ECBDateToUse and
        ECB.Currency = m.InvoiceCurrency
WHERE (m.InvoiceCurrency NOT LIKE 'EUR%')
于 2013-04-03T14:35:38.663 回答
0

我想你在找什么LEFT OUTER JOIN

SELECT DISTINCT dbo.ECB.Currency + '-' + CAST(dbo.myTable.CutoffDate AS varchar(30)) AS ComboCurrDate, dbo.ECB.Rate AS ECBrate
FROM mytable LEFT OUTER JOIN ECB ON dbo.ECB.Date = CASE WHEN datepart(weekday, dbo.myTable.CutoffDate) IN (6, 7) THEN dateadd(d, - ((datepart(weekday, 
                  dbo.myTable.CutoffDate) + 1 + @@DATEFIRST) % 7), dbo.myTable.CutoffDate) ELSE dbo.myTable.CutoffDate END AND 
                  dbo.ECB.Currency = dbo.myTable.InvoiceCurrency

这将返回 mytable 中的所有记录,无论 ECB 表中是否有结果。您可以添加过滤器 AND ECB.date IS NULL 以仅提取 ECB 表中不存在的记录

于 2013-04-03T14:29:20.017 回答
0

使用外连接,并将所有影响连接外侧的谓词条件放在连接条件中,而不是放在 where 子句中。另外,我可以谦虚地建议您使用表别名和格式来使 sql 更具可读性。如果读者可以更轻松地理解您的查询,您将更快地获得问题的答案。

SELECT DISTINCT e.Currency + '-' + 
    CAST(m.CutoffDate AS varchar(30)) ComboCurrDate, 
    e.Rate ECBrate
FROM dbo.ECB e  Left JOIN dbo.myTable m 
     ON e.Currency = m.InvoiceCurrency
          And m.InvoiceCurrency NOT LIKE 'EUR%'
          And e.Date = 
               CASE WHEN datepart(weekday, m.CutoffDate) IN (6, 7) 
                    THEN dateadd(d, - ((datepart(weekday, 
                         m.CutoffDate) + 1 + @@DATEFIRST) % 7), m.CutoffDate) 
                    ELSE m.CutoffDate END 
于 2013-04-03T14:39:27.897 回答