2013-04-03 133 views
0

這指的是我以前的帖子:LinkSQL更換日期值,如果日期是假期或週末

系統: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表內的前一個日期,依此類推。

希望我能解釋清楚。

謝謝你的幫助。

回答

1

我認爲您應該在數據中的每個截止日期獲取最新的ECB日期。

下將此作爲一個相關子查詢:

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%') 
+0

戈登:我不得不刪除INNER JOIN來讓它工作。 「錯誤的語法」。數據看起來不錯。你能否確認內部連接是否需要? – SvenB

+0

好吧,它似乎沒有Inner Join Stmt工作,所以我會將其標記爲正確的答案。謝謝。 – SvenB

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不論是否有歐洲央行表的結果。您可以添加AND ECB.date IS NULL的過濾器,以便只吸引ECB表中不存在的記錄

+0

。 。百萬道歉。我無法上傳我的答案,最後我覆蓋了你的答案(爲了解決我的問題,我必須不斷重新編輯和重新編輯我的答案,而不是我的錯誤點擊)。 Arrgg! –

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 
相關問題