无法正确使用大小写和汇总

时间:2019-06-05 15:41:49

标签: sql oracle

我有下表

现金表

ID          Cash   Rates  Amount
1           50     3      16
2           100    4      25
3           130    10     7
3           130    10     6
4           13     7      1.8
5           30     8      2.5
5           30     10     1
6           10     5      2

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

ID          New_Cash         New_Rates  New_Amount
1           50               3           16
2           100              4           25
3           130              10+10       130/(10+10)
4           13               7           1.8
5           30               8+10        30/(8+10)
6           10               5           2

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

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

问题出在New_Amount列上:

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

   select id, 
   cash as new_cash,
   sum(rates) as new_rates,
   (case count(id)
   when 1 then amount 
   else cash/sum(nvl(rates,null))
   end) as new_amount
   from Cash_table
   group by id

1 个答案:

答案 0 :(得分:1)

由于ID的现金价值始终是相同的,因此您也可以将其分组:

select id, 
  cash as new_cash,
  sum(rates) as new_rates,
  case count(id)
    when 1 then max(amount)
    else cash/sum(rates)
  end as new_amount
from cash_table
group by id, cash
order by id

        ID   NEW_CASH  NEW_RATES NEW_AMOUNT
---------- ---------- ---------- ----------
         1         50          3         16
         2        100          4         25
         3        130         20        6.5
         4         13          7        1.8
         5         30         18 1.66666667
         6         10          5          2

case表达式的第一个分支需要汇总,因为您没有按金额分组。而sum(nvl(rates,null))可以是sum(rates)。如果您期望任何零利率,则需要决定如何处理该金额,但是nvl(rates,null)并没有做任何事情。

如果愿意,您可以在不使用case表达式的情况下执行相同的操作,操作所有值-可能会更昂贵:

select id, 
  cash as new_cash,
  sum(rates) as new_rates,
  sum(amount * rates)/sum(rates) as new_amount
from cash_table
group by id, cash
order by id