使用sum返回一些记录

时间:2016-01-07 16:15:40

标签: oracle sum

我正在尝试根据选择记录时添加的页数返回大量记录。页数会有所不同,但我希望每个批次返回的页数都在一个范围内。像这样......

DATA

PRINT ID      PAGE_COUNT   STATUS
1000          50           READY
1001          50           READY
1002          50           READY
1003          75           READY

select PRINT_ID, PAGE_COUNT,STATUS from PRINT_JOB
where STATUS = 'READY' and
sum (page_count)>100 and sum(page_count)<200

RETURNED

PRINT_ID      PAGE COUNT   STATUS
1000          50           READY
1001          50           READY
1002          50           READY

我尝试过HAVING并使用子查询。它似乎只是将页面数量落在范围内的单个部分带回来,而不是总计页面总数。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果可以按照PRINT_ID的顺序对记录进行分组,那么每个组都有SUM(PAGE_COUNT)&gt; 100(或表末尾的其余记录);这里有一个使用recursive subquery factoring

的解决方案

在第一步中,我将顺序ID添加到与PRINT_ID相同的表中,该表将用于递归。

create table  TAB_DATA as
select print_id, page_count,
row_number() over (order by print_id) as id
from data;

select * from tab_data order by id;

  PRINT_ID PAGE_COUNT         ID
---------- ---------- ----------
      1000         50          1 
      1001         50          2 
      1002         50          3 
      1003         75          4 

初始子查询将控制器acc设置为零并初始化第一组。递归子查询执行检查限制和增加组ID的逻辑。

with dt(id, print_id, page_count, acc, grp) as (
 select id, print_id, page_count, 0 acc, 1 grp from tab_data where id = 1
union all
 select tab_data.id, tab_data.print_id, tab_data.page_count,
  -- accumulate
  case when 
   dt.acc+dt.page_count >  100 then /* new group, reset acc */ 0 
  else dt.acc+dt.page_count end as acc,
  -- define group
  case when 
   dt.acc+dt.page_count >  100 then /* increase group */ grp+1 
  else grp end as grp
 from tab_data, dt
 where tab_data.id=dt.id+1)
select * from dt
;

按要求返回

        ID   PRINT_ID PAGE_COUNT        ACC        GRP
---------- ---------- ---------- ---------- ----------
         1       1000         50          0          1 
         2       1001         50         50          1 
         3       1002         50        100          1 
         4       1003         75          0          2 

我没有考虑第二个限制<200。但我希望这能为您提供如何优化规则以实现它的想法。