2017-08-17 80 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