2017-08-17 96 views
0

我需要你的幫助。我有下面的查詢,但我不認爲按預期工作。Oracle SQL - 來自多個日期列的最早日期

業務規則是Date1必須是最早的日期,如果不是,則顯示Date1不是最早的所有記錄。我從這個查詢開始,但我認爲它需要一些抽動才能工作,請你幫忙。

SELECT f.id_number,f.status,E.Date1,E.Date2,E.Date3,E.Date4,E.Date5,E.Date6 
CASE 
    WHEN E.Date1 > E.Date2  THEN 'Date2'   || ' ' || E.Date2 
    WHEN E.Date1 < E.Date3  THEN 'Date3'   || ' ' || E.Date3 
    WHEN E.Date1 < E.Date4  THEN 'Date4'   || ' ' || E.Date4 
    WHEN E.Date1 < E.Date5  THEN 'Date5'   || ' ' || E.Date5 
    WHEN E.Date1 < E.Date6  THEN 'Date6'  || ' ' || E.Date6 
     END AS THE_DATE 
FROM 
     TableE E 
LEFT JOIN TableF F 
     ON F.id_number = E.id_number 
WHERE E.Date1 IS NOT NULL 
+0

WHEN E.Date1> E.Date2爲什麼這是一個 「>」 當所有其餘的是 「<」? – user681574

+0

嗨,這是我在測試查詢期間的錯字。我相信是「>」 – netraider

+0

Plz提供樣本數據以更好地理解 – Rams

回答

1

試試這個。使用LEAST()函數獲取最早的日期。

SELECT f.id_number, 
    f.status, 
    e.date1, 
    e.date2, 
    e.date3, 
    e.date4, 
    e.date5, 
    e.date6, 
    CASE 
    WHEN Least (e.date1, e.date2, e.date3, e.date4, e.date5, e.date6) = 
      date1 THEN 
    To_char(e.date1) 
    ELSE decode(Least(e.date1, e.date2), e.date1, '', 
              ' Date2' 
              || ' ' 
              || To_char(e.date2)) 
      || decode(Least(e.date1, e.date3), e.date1, '', 
              ' Date3' 
              || ' ' 
              || To_char(e.date3)) 
      || decode(Least(e.date1, e.date4), e.date1, '', 
              ' Date4' 
              || ' ' 
              || To_char(e.date4)) 
      || decode(Least(e.date1, e.date5), e.date1, '', 
              ' Date5' 
              || ' ' 
              || To_char(e.date5)) 
      || decode(Least(e.date1, e.date6), e.date1, '', 
              ' Date6' 
              || ' ' 
              || To_char(e.date6)) 
    END THE_DATE 
FROM (SELECT NVL(date2, date1), 
      NVL(date3, date1), 
      NVL(date4, date1), 
      NVL(date5, date1), 
      NVL(date6, date1) FROM TableE) E 
    LEFT JOIN tablef F 
      ON F.id_number = e.id_number 
WHERE e.date1 IS NOT NULL; 

下面是一個數據輸出採樣

ID_NUMBER STATUS DATE1 DATE2 DATE3 DATE4 DATE5 DATE6 THE_DATE                 
---------- ------ -------- -------- -------- -------- -------- -------- --------------------------------------------------------------------------- 
     1 TRUE 20-08-17 19-08-17 20-08-17 19-08-17 22-08-17 18-08-17 Date2 19-08-17 Date4 19-08-17 Date6 18-08-17   
+0

非常感謝。還有一個問題。如何在日期列上忽略空值?通過上面的查詢,如果該列爲空,則填充THE_DATE列。例如,如果Date3和Date4爲空,它會在THE_DATE列下顯示「Date3 Date4」。 – netraider

+0

如果其中任何一個爲null,則可以將date2,date3..date6默認爲date1。我已相應地修改了查詢。但是,如果date1本身爲空,那麼您將不會得到任何結果。 –

+0

非常感謝。非常感激。 – netraider