我有下表
现金表
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
答案 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