如果总和为负,则返回组的总和

时间:2017-01-18 22:36:23

标签: sql plsql oracle11g group-by sum

我正在尝试确定查询表的逻辑/语法,并获取具有特定组负数的任何行。例如:

  ID   | Month  | Amt Due
------ | ------ | ------
  1    |  Jan   |   15
------ | ------ | ------
  1    |  Jan   |  -20
------ | ------ | ------
  1    |  Mar   |   3
------ | ------ | ------ 
  2    |  Aug   |   13
------ | ------ | ------
  2    |  Dec   |   40
------ | ------ | ------  
  2    |  Dec   |  -25
------ | ------ | ------      

基本上,查询会看到有两个ID在同一个月内有多个ID:

  • ID1,Jan
  • ID2,Dec

然后它将取 amt due 列的总和:

  • Jan(-5)
  • Dec(15)

由于我只想要否定结果,最终结果将是:

 ID    | Month  | SUM(Amt Due)
------ | ------ | ------
  1    |  Jan   |   -5
------ | ------ | ------

这用于识别任何一个月都有负数的ID,因为系统永远不会产生负的amt_due总和。

1 个答案:

答案 0 :(得分:4)

group by条件下使用having

select id,month,sum(amt_due) 
from tablename 
group by id,month
having sum(amt_due) < 0

如果此检查仅适用于行数超过1的组,请再添加一个条件and count(*) > 1。查询将是

select id,month,sum(amt_due) 
from tablename 
group by id,month
having sum(amt_due) < 0 and count(*) > 1

编辑:根据OP的评论,查询应为

select tb1.acct_num, tb2,inv_id, tb3.acctinv_id, to_char(tb3.frm_dt, 'MON'), sum(tb3.amt_due), tb3.type_id 
from table1 tb1 
join table2 tb2 on tb1.inv_id = tb2.inv_id
join table3 tb3 on tb2.acctinv_id = tb3.acctinv_id 
where tb3.type_id = 10 
group by tb1.acct_num, tb2,inv_id, tb3.acctinv_id, to_char(tb3.frm_dt, 'MON'), tb3.type_id
having sum(tb3.amt_due) < 0

我不确定您是否需要所有这些列进行分组。您收到错误,因为所选的所有非聚合列都未包含在group by