如何在select语句中使用行数来修改查询以获取10天的数据,如果5天的行数为0?

问题描述 投票:0回答:2

我需要使用rowcount修改脚本以检查表中的数据吗?在这里,我编写查询以选择从当前系统日期起最近5天的数据。但有时5天内表中没有数据。所以我需要提取10天或更长时间。

Query:

Select ep.ENTERPRISE_NAME||'|'||s.id||'|'||s.SUBMISSION_DATE||'|'||E.VALUE
from JOB_SUMMARY_EXT e, ob_summary s, enterprise ep
where e.id = s.id and e.name_res_key = 'Model'
and s.job_id in (select id from job_summary where
trunc(start_date) > trunc(sysdate) -10 and service_name ='Model2' )

我不知道如何使用rowcount修改查询。如果rowcount为0,那么我想选择10天的数据。否则它将自动获取5天。我希望将其作为单个查询来完成。

oracle sqlplus
2个回答
1
投票

看来您要从该表中选择最近5天。那么,如果那几天的每一天都没有行,为什么要anchorSYSDATE?我建议另一种方法:按字面意思,选择最近5天。这是方法。

由于我没有您的表格,所以我使用的是Scott的EMP表格,其中包含有关员工的信息。它是一个古老的列,因此HIREDATE列设置为1980年代,但是不要紧。按HIREDATE降序对员工进行排序显示:

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

SQL> select ename, hiredate from emp order by hiredate desc;

ENAME      HIREDATE
---------- ----------
ADAMS      12.01.1983    1.
SCOTT      09.12.1982    2.
MILLER     23.01.1982    3.
FORD       03.12.1981    4.
JAMES      03.12.1981    4.
KING       17.11.1981    5.   --> I want to fetch rows up to KING
MARTIN     28.09.1981
TURNER     08.09.1981
CLARK      09.06.1981
BLAKE      01.05.1981
JONES      02.04.1981
WARD       22.02.1981
ALLEN      20.02.1981
SMITH      17.12.1980

14 rows selected.

SQL>

如您所见,第4个约会是由两名员工共享的,所以我想将他们都包括在内。 DENSE_RANK分析功能有助于:

SQL> with last5 as
  2    (select ename,
  3            job,
  4            sal,
  5            hiredate,
  6            dense_rank() over (order by hiredate desc) rnk
  7     from emp
  8    )
  9  select ename, job, sal, hiredate
 10  from last5
 11  where rnk <= 5;

ENAME      JOB              SAL HIREDATE
---------- --------- ---------- ----------
ADAMS      CLERK           1100 12.01.1983
SCOTT      ANALYST         3000 09.12.1982
MILLER     CLERK           1300 23.01.1982
JAMES      CLERK            950 03.12.1981
FORD       ANALYST         3000 03.12.1981
KING       PRESIDENT       5000 17.11.1981

6 rows selected.

SQL>

它做什么?LAST5CTE对员工进行排序(如上所述),DENSE_RANK对员工进行排名;最后,最后一个SELECT(从第9行开始)获取所需的行。


在您的情况下,可能看起来像这样:

with last5 as
  (select id,
          dense_rank() over (order by start_date desc) rnk
   from job_summary
   where service_name = 'Model2'
  )
select ep.enterprise_name, 
       s.id, 
       s.submission_date, 
       e.value
from job_summary_ext e 
  join ob_summary s on e.id = s.id
  join last5 t on t.id = s.id
  join enterprise ep on <you're missing join condition for this table>
where e.name_res_key = 'Model';

请注意,您缺少ENTERPRISE表的加入条件;如果真的是这样,那么没问题-您可以在该表中使用cross join,但是我不知何故怀疑您想要这样做。

最后,当您使用SQL * Plus时,也许您不需要连接所有列并用竖线|符号将它们分开-将其设置为列分隔符,例如]]

SQL> set colsep '|'
SQL>
SQL> select deptno, dname, loc from dept;

    DEPTNO|DNAME         |LOC
----------|--------------|-------------
        10|ACCOUNTING    |NEW YORK
        20|RESEARCH      |DALLAS
        30|SALES         |CHICAGO
        40|OPERATIONS    |BOSTON

SQL>

如果您想

  • 如果select count(*)返回0,则返回最后10天,否则
  • 如果select count(*)返回正数,则返回最后5天>>
  • 那么类似的事情可能会有所帮助(再次基于Scott的EMP表):

with 
tcnt as
  -- count number of rows; use your own requirement, I'm checking
  -- whether someone got hired today. In Scott's EMP table, nobody was
  -- so CNT = 0
  (select count(*) cnt
   from emp 
   where hiredate >= trunc(sysdate)
  )
select e.ename, e.job, e.sal, e.hiredate
from emp e cross join tcnt c
where e.hiredate >= case when c.cnt = 0 then trunc(sysdate) - 10
                         else                trunc(sysdate) -  5
                    end;

将其应用于您的表;我不知道要检查这3个表的哪个count

试图添加注释,但是注释太长了,并且基于计数还不清楚,但是在这种情况下,子句用nvl函数代替了count语句

 SELECT ep.ENTERPRISE_NAME||'|'||s.id||'|'||s.SUBMISSION_DATE||'|'||E.VALUE
    FROM JOB_SUMMARY_EXT e,
         ob_summary s,
         enterprise ep
    WHERE e.id = s.id
      AND e.name_res_key = 'Model'
      AND s.job_id IN
        (SELECT id
         FROM job_summary
         WHERE service='Model'
           AND trunc(start_date) > 
          CASE WHEN
              (WRITE your SELECT COUNT criteria WITH NVL FUNCTION)<=0 THEN 
                 trunc(sysdate) -10 
               ELSE trunc(sysdate)-5 
           END )

0
投票

试图添加注释,但是注释太长了,并且基于计数还不清楚,但是在这种情况下,子句用nvl函数代替了count语句

© www.soinside.com 2019 - 2024. All rights reserved.