【问题标题】:Return min(DATE) if Date does not exist如果日期不存在,则返回 min(DATE)
【发布时间】:2016-02-22 05:12:45
【问题描述】:

在 Oracle SQLDeveloper 中,我正在尝试运行一个查询,在该查询中我发现返回特定日期作为 StartDate,但如果最早的现有日期大于指定的开始日期,则返回最小日期。我尝试使用 CASE 语句执行此操作,但我不断收到“缺少右括号”错误。到目前为止,这是我的代码:

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 语句,但我无法让它返回我想要的。

【问题讨论】:

    标签: sql oracle case min


    【解决方案1】:

    您可能需要考虑 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;
    

    【讨论】:

    • 只是一个建议,可能先回答或解决OP问题,然后添加推荐。我很困惑试图看看合并如何解决问题。你的答案看起来还是正确的。
    • 感谢pkm的回复!我尝试运行您的查询,但我得到了Error ORA-00932。我尝试使用 to_date() 来解决这个问题,但我仍然遇到同样的错误。
    • 哦等等! to_date 函数确实有效!我只需要使用可识别的日期格式。
    【解决方案2】:

    您的陈述在语法上不正确。 将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
    ;
    

    【讨论】:

    • 感谢您的回复!我修复了语法并再次运行它,但现在我得到“错误 ORA-00934:此处不允许使用组函数”。 :(关于如何解决这个问题的任何建议?
    • 对不起,我没有看到那部分。 where 子句中不能有聚合函数。将and (case when b.date=' ' then min(b.date) else b.date end) = '27-JAN-13' 从您的查询中删除。
    猜你喜欢
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多