2015-11-19 93 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