【问题标题】:Oracle double count caseOracle 双重计数案例
【发布时间】:2013-04-16 14:04:43
【问题描述】:

我有如下sql语句:

     COUNT(CASE 
          WHEN CALCULATE_CALLBACK_DURATION(CREATED, LAST_UPD) IS NULL THEN CALCULATE_CALLBACK_DURATION(AA.THIS_DATE_OPENING, LAST_UPD) /60 /60 < 2 THEN 1
          ELSE CALCULATE_CALLBACK_DURATION(CREATED, LAST_UPD) /60 /60 < 2 THEN 1 
     END) AS Calculatedsum

其中CALCULATE_CALLBACK_DURATION(CREATED, LAST_UPD) 是一个返回总和(以秒为单位)的函数

但是我得到了错误

缺少关键字

我做错了什么?甚至可以这样计算吗?

更新

我还尝试了以下方法:

 CASE WHEN CALCULATE_CALLBACK_DURATION(AA.THIS_DATE_OPENING, LAST_UPD) /60 /60 < 2
 THEN 1 END 
ELSIF CALCULATE_CALLBACK_DURATION(CREATED, LAST_UPD) /60 / 60 <2 THEN 1 END IF) AS Calculatedsum

问题是如果计算结果为空,那么它应该以另一种方式计算总和并检查是否小于2然后将其计为+1

【问题讨论】:

    标签: sql oracle count case


    【解决方案1】:

    您错过了另一个WHEN(您连续有两个THENs)。这个

    WHEN CALCULATE_CALLBACK_DURATION(CREATED, LAST_UPD) IS NULL -- MISSING VALUE
    THEN CALCULATE_CALLBACK_DURATION(AA.THIS_DATE_OPENING, LAST_UPD) /60 /60 < 2 THEN 1
    -- ^-- Wrong keyword
    

    应该是

    COUNT(CASE
      WHEN CALCULATE_CALLBACK_DURATION(CREATED, LAST_UPD) IS NULL THEN
        CASE
        WHEN (CALCULATE_CALLBACK_DURATION(AA.THIS_DATE_OPENING, LAST_UPD) /60 /60 < 2)
          OR (CALCULATE_CALLBACK_DURATION(CREATED, LAST_UPD) /60 /60 < 2) THEN 1
        ELSE 0 END
      ELSE 0
    END) AS Calculatedsum
    

    【讨论】:

    • 问题在于如果函数返回 null 它应该尝试该函数但有两个新参数然后它应该计算它们否则运行 else 案例简而言之我不想得到 null 但而是避免 null
    • @MarcRasmussen 看看编辑 - 你需要一个嵌套的CASE
    • else 为 0 的两种情况不应该是 CALCULATE_CALLBACK_DURATION(CREATED, LAST_UPD) /60 /60 吗?
    • @MarcRasmussen 我认为您可以将这两个条件与OR 结合起来,因为在这两种情况下您都会返回1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2015-06-10
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多