如何将行限制为列的SUM等于某个值并转到下一行Oracle

时间:2015-12-27 04:42:03

标签: sql oracle

根据我的问题,我已经设法得到了答案..但随后出现了一个新问题,我需要像这样显示:

首先,这是学习计划表

enter image description here

所以现在,在第一次运行时,如果我想获取行,直到Credit of Credit列等于18,它将显示如下:

enter image description here

但是,然后在第二次运行时,如果我想获取行,直到Credit列的SUM等于21,我希望它显示为这样:

enter image description here

我希望它在下一行汇总列?我是否必须制作2条SQL语句?

以下是第一次运行的成功代码:

SELECT * FROM
(SELECT t.*,
SUM(t.credit) OVER (PARTITION BY t.matricsno ORDER BY t.sem, t.subjectcode)
AS credit_sum
FROM studyplan t)
WHERE credit_sum <= 17 AND matricsno = 'D031310087';

感谢您的回复和时间。

以下是链接How to limit rows to where SUM of a column equals to certain value in Oracle

1 个答案:

答案 0 :(得分:1)

这有点奇怪的要求。但是,是的,如果你想要2个不同的结果集,你需要单独的2个SQL语句。但是对于每个附加声明,您只需要在credit_sum上调整您的条件。

例如,如果您的第一个查询想要获得信用额达到18的行,那么您可以这样做:

select *
  from (select t.*,
               sum(t.credit) over (order by t.sem, t.subjectcode) as credit_sum
          from studyplan t
         where t.matricsno = 'D031310087')
 where credit_sum <= 18
 order by sem, subjectcode

对于第二个查询,您说您希望信用额达到21的行,但忽略第一个查询返回的行。表达该要求的另一种方式是返回累积信用额在19和39之间(包括19和39)的行。那么,只需修改credit_sum上的过滤器即可使用between条件:

select *
  from (select t.*,
               sum(t.credit) over (order by t.sem, t.subjectcode) as credit_sum
          from studyplan t
         where t.matricsno = 'D031310087')
 where credit_sum between 19 and 39
 order by sem, subjectcode