2015-11-19 77 views
2

在Oracle SQLDeveloper中,我試圖運行一個查詢,在該查詢中我發現返回特定日期作爲StartDate,但如果最早的現有日期大於指定日期,則返回最小日期開始日期。我試着用CASE語句來做這件事,但我一直得到「缺少右括號」的錯誤。這裏是我的代碼到目前爲止:如果Date不存在,返回min(DATE)

select 
    a.program 
    , a.match_file 
    , (case when b.date = '27-JAN-13' then b.date else min(b.date end)) as Startdate 
from Schema1.program a, Schema1.detail b 
where a.match_file = b.matchfile 
    and (case when b.date=' ' then min(b.date) else b.date end) = '27-JAN-13' 
    group by a.program, a.match_file 
; 

有人可以讓我知道,如果我去這個錯誤?我也嘗試過使用IF語句和一些不同的UNION語句,但我無法讓它返回我想要的。

回答

3

您可能想要考慮COALESCE函數(選取第一個非空參數)。但是,如果您針對空白而不是空值進行篩選,則可能無效。在這種情況下,CASE聲明應該適合您的需求。

在你的代碼中,你的第一個case語句中的「end」在min()中,這可能是你得到錯誤的原因。

, (case when b.date = '27-JAN-13' then b.date else min(b.date) end) as Startdate 

我有麻煩搞清楚什麼你正在嘗試做的,而是根據你的描述我想出了下面的SQL。我不認爲你需要在你的where子句中做任何過濾,因爲你需要每一行都有結果。如果最早的日期在1月27日之後,您只想知道每個程序/文件組合。 select中的case語句處理這個問題。

「返回一個特定的日期爲起始日期,但返回最小日期 如果現存最早的日期早於指定的開始 日期更大的」

select 
    a.program 
    , a.match_file 
    , case when min(b.date) > '27-JAN-13' then min(b.date) else '27-JAN-13' end as Startdate 
from Schema1.program a, Schema1.detail b 
where a.match_file = b.matchfile 
group by a.program, a.match_file; 
+1

只是一個建議,也許第一個答案或解決問題的OP,然後添加recomendation。我很困惑,想看看這個合併如何解決問題。你的答案仍然正確。 –

+0

感謝您的回覆pkm!我試着運行你的查詢,但我得到了[Error ORA-00932](http://stackoverflow.com/questions/18330123/lookup-error-ora-00932-inconsistent-datatypes-expected-date-got-number)。我嘗試使用to_date()來解決這個問題,但我仍然得到了同樣的錯誤。 – Jacob

+0

哦等一下! to_date函數確實有效!我只需要使用可識別的日期格式。 – Jacob

1

你的說法是語法不正確。 移動end外分鐘骨料按以下

select 
    a.program 
    , a.match_file 
    , (case when b.date = '27-JAN-13' then b.date else min(b.date) end) as Startdate 
from Schema1.program a, Schema1.detail b 
where a.match_file = b.matchfile 
    and (case when b.date=' ' then min(b.date) else b.date end) = '27-JAN-13' 
    group by a.program, a.match_file 
; 
+0

感謝您的回覆!我修復了語法並再次運行,但是現在我得到了「錯誤ORA-00934:此處不允許使用組功能。」 :( 關於如何解決這個問題的任何建議? – Jacob

+1

對不起,我沒有看到那個部分。你不能在where子句中有一個聚合函數。用'和(case when b.date =''then min(b .date)else b.date end)= '27 -JAN-13''不在您的查詢中。 – Lock