仅在count(ID)大于1的行上使用聚合

时间:2019-05-31 15:04:59

标签: sql oracle

嗨,我有下表

现金表

ID          Cash   Rates
1           50   3
2           100  4
3           70   10
3           60   10
4           13   7
5           20   8
5           10   10
6           10   5  

我想要的结果是像这样累积所有具有 Count(id)> 1 的条目:

ID          New_Cash            New_Rates
1           50                  3
2           100                 4
3           (70+60)/(10+10)     10+10
4           13                  7
5           (20+10)/(8+10)      8+10
6           10                  5   

所以我只想更改Count(id)> 1的行,其余的保持原样。

对于count(id)> 1的行,我想对比率求和,取现金总和除以比率总和。仅凭费率就不成问题,因为我可以对它们进行汇总并按id分组,以获得所需的结果。

问题出在现金栏上

我正在尝试使用case语句来执行此操作,但是它不起作用:

   select id, sum(rates) as new_rates, case 
   when count(id)>1 then sum(cash)/nullif(sum(rates),0))
   else cash
   end as new_cash
   from Cash_table
   group by id

2 个答案:

答案 0 :(得分:2)

您只需要group by id并进行汇总:

 select 
   id,
   sum(cash) / (case count(*) when 1 then 1 else sum(rates) end) as new_cash, 
   sum(rates) as new_rates
 from Cash_table
 group by id
 order by id

请参见demo

答案 1 :(得分:1)

您可以通过rate函数汇总cashsum()列并按ID分组

select 
       id,             
       sum(cash)/decode( sum( nvl(rates,0) ), 0 ,1, sum( nvl(rates,0) )) as new_cash,
       sum(rates) as new_rates 
  from cash_table
 group by id
  • Oracle中没有nullif()函数,请改用nvl()
  • 切换案例部分(使用decode()函数) 被零除的可能性