【问题标题】:Return the sum of a group if the sum is negative如果总和为负,则返回组的总和
【发布时间】:2023-04-01 23:15:01
【问题描述】:

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

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

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

  • ID1,一月
  • ID2,十二月

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

  • 一月 (-5)
  • 十二月 (15)

由于我只想要底片,所以最终结果是:

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

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

【问题讨论】:

  • 如果组中只有一条记录为负数,是否也应该返回该行?
  • 是的,如果有任何月份的总和为负数,则应返回。
  • 您是否需要生成摘要行(就像您在帖子中显示的那样),或者查看此类ID, Month 组合的各个行是否会有所帮助?如果您只需要摘要,vkp 已经给您答案了。查看组成这些组合的各个行也相对容易 - 使用分析函数而不是聚合。

标签: sql plsql oracle11g group-by sum


【解决方案1】:

group byhaving 条件结合使用。

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

如果该检查只应针对超过 1 行的组进行,请再添加一个条件 and count(*) &gt; 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 中。

【讨论】:

  • 感谢您的评论!到目前为止,我通过一些连接得到了以下结果:ORA-00979:不是 GROUP BY 表达式:选择 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, table2 tb2, table3 tb3 where tb1.inv_id = tb2.inv_id and tb2.acctinv_id = tb3.acctinv_id and tb3.type_id = 10 group by tb1.acct_num, tb3.frm_dt有 sum(tb3.amt_due)
  • 谢谢!我删除了很多列以使实际分组正确(我不想按 inv_id 或 acctinv_id 分组,只是 acct_num)。我也忘了添加to_char。现在一切正常!
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多