【问题标题】:I want to query the oracle db for getting count with multpile case clauses我想查询 oracle 数据库以获取多个 case 子句的计数
【发布时间】:2014-10-08 09:01:21
【问题描述】:

这是我正在尝试的查询:

SELECT DISTINCT(
  ( select distinct (
      (SELECT COUNT(*)  
       FROM PROCESS 
       WHERE STARTDATE > sysdate - INTERVAL '7' DAY) - 
      (SELECT COUNT(*) 
       FROM PROCESS 
       WHERE STARTDATE > sysdate - INTERVAL '14' DAY AND 
             STARTDATE < sysdate - INTERVAL '7' DAY)
  )as c3
  from process) /
  ( SELECT (CASE WHEN COUNT(*)=0 THEN (
      SELECT (case WHEN COUNT(*)=0 THEN 1  ELSE COUNT(*) end) 
      FROM PROCESS 
      WHERE STARTDATE > SYSDATE - INTERVAL '7' DAY  ) 
    ELSE COUNT(*) END)  
   FROM PROCESS 
   WHERE STARTDATE > SYSDATE - INTERVAL '14' DAY AND
         STARTDATE < SYSDATE - INTERVAL '7' DAY )
) AS ORDER_VOLUME FROM PROCESS;

但我收到此错误:

ORA-00937: not a single-group group function
00937. 00000 -  "not a single-group group function"
*Cause:    
*Action:
Error at Line: 1 Column: 295

谁能帮我解决这个问题?

这是我想要的

1) 获取 STARTDATE > SYSDATE - INTERVAL '14' DAY AND 的计数 STARTDATE SYSDATE - INTERVAL '14' DAY AND STARTDATE

如果在步骤 2) 中检索到的计数也为 0,则将计数设置为 1 else 设置检索到的计数

【问题讨论】:

  • 请通过绘制问题添加示例数据和您想要的结果
  • 首先你应该分别执行两个选择(在/之前和之后),这样你就可以更好地知道哪个部分导致了错误
  • @Andreas 我在下半场遇到问题(在 / 之后)

标签: sql oracle


【解决方案1】:

对我来说,这看起来像是一个 Oracle 错误。该查询在语法上似乎是正确的。

但是,您似乎并不确切地知道自己在做什么。该语句使用 DISTINCT 两次看起来很奇怪,当您人为地为表进程中的记录数重复一个值时,这绝对没有意义。

这就是您的查询将执行的操作,如果错误不会阻止此操作:

select
  (count_last_week - count_week_before_last_week) / 
  case 
    when count_week_before_last_week > 0 then  count_week_before_last_week
    when count_last_week > 0 then              count_last_week
    else                                       1
  end as order_volume
from
(
  select 
    sum(case when startdate > sysdate - interval '7' day then 1 end) as count_last_week,
    sum(case when startdate > sysdate - interval '14' day and startdate < sysdate - interval '7' day then 1 end) as count_week_before_last_week
  from process
);

检查这是否是您真正想要的,并在必要时修改此查询。

顺便说一句:请注意,您有 startdate &gt; sysdate - interval '7' daystartdate &lt; sysdate - interval '7' day,但没有 startdate = sysdate - interval '7' day。另外:您是故意考虑时间还是更愿意使用 trunc(startdate) 和 trunc(sysdate)?

【讨论】:

    【解决方案2】:

    '/'之后的这部分

    SELECT  (
    **--**CASE  WHEN COUNT()=0 THEN (
        SELECT  (
        case    WHEN COUNT()=0 THEN 1 
            ELSE    COUNT() 
        end ) 
    FROM    PROCESS 
    WHERE   STARTDATE > SYSDATE - INTERVAL '7' DAY ) 
    ELSE    COUNT() 
    END ) 
    

    你不认为应该有一个选择,我将它标记为'--'你 innser sql 没有选择是错误的,或者只是删除那个括号并尝试像

    SELECT  
    CASE    WHEN COUNT()=0 THEN (
        SELECT  (
        case    WHEN COUNT()=0 THEN 1 
            ELSE    COUNT() 
        end ) 
    FROM    PROCESS 
    WHERE   STARTDATE > SYSDATE - INTERVAL '7' DAY ) 
    ELSE    COUNT() 
    END 
    FROM    PROCESS** 
    

    【讨论】:

    • 与内部 sql 类似:SELECT (case WHEN COUNT()=0 THEN 1 ELSE COUNT() end) FROM PROCESS WHERE STARTDATE > SYSDATE - INTERVAL '7' DAY 将其编辑为 SELECT case WHEN COUNT( )=0 THEN 1 ELSE COUNT() 从 STARTDATE > SYSDATE 的过程结束 - 间隔“7”天
    • 这是我现在想尝试的 SELECT case when count()=0 then( SELECT case WHEN COUNT()=0 THEN 1 ELSE COUNT() end FROM STARTDATE > SYSDATE - 间隔'7'天的过程)否则计数()从STARTDATE > SYSDATE - 间隔'14'天和STARTDATE
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多