我想将数据分组到某个级别,然后应用分析函数来获得此级别的百分比贡献超过此级别: -
我有一个表Temp_analytic
数据如下。此表中的数据遵循heirarchy(投资组合和inv_num具有一对多关系,inv_num和loan_num具有一对多关系。
Loan_num汇总到Inv_num和inv_num进一步汇总到投资组合
贷款级别的基本数据。 我会将数据分组到投资者级别,并希望看到每个投资者对投资组合的百分比贡献
基础数据
Loan_num Inv_num portfolio Balance
1111 1 A 10
2222 1 A 20
3333 1 A 30![enter image description here][1]
4444 2 A 40
5555 2 A 50
6666 2 A 60
7777 3 B 70
8888 3 B 80
9999 3 B 90
我使用分析函数Sum over partition by portfolio
查询
select loan_num, inv_num, portfolio, balance, round(balance/sum(balance) over (partition by portfolio),4.2)*100 portfolio_perc
from Temp_analytic
order by portfolio
结果
LOAN_NUM INV_NUM PORTFOLIO BALANCE PORTFOLIO_PERC
1111 1 A 10 4.76
2222 1 A 20 9.52
3333 1 A 30 14.29
4444 2 A 40 19.05
5555 2 A 50 23.81
6666 2 A 60 28.57
7777 3 B 70 29.17
8888 3 B 80 33.33
9999 3 B 90 37.50
所以我能够获得贷款对投资组合的百分比贡献
如果我尝试计算INV_NUM对投资组合的百分比控制。我收到了一个错误 "不是按功能分组"使用下面的查询很明显。我想知道的是,我们可以将数据汇总或分组到一个级别并应用分析函数(分区到更高级别)吗?
select inv_num, sum(balance), round(balance/sum(balance) over (partition by portfolio),4.2)*100 portfolio_perc
from delete_srini
group by inv_num
order by portfolio
最好的方法是什么
结果应如下所示
INV_NUM PORTFOLIO BALANCE PORTFOLIO_PERC
1 A 60 28.60
2 A 150 71.40
3 B 240 100.00
请帮忙。
答案 0 :(得分:1)
你有正确的想法。但是,使用子查询首先聚合数据,然后使用分析函数:
select inv_num, portfolio, balance,
round(balance/sum(balance) over (partition by portfolio),4.2)*100 as portfolio_perc
from (select inv_num, portfolio, sum(balance) as balance
from Temp_analytic ta
group by inv_num, portfolio
) ta
order by inv_num;
实际上你可以一次性完成这项工作 - 没有子查询。但是,使用分析函数和聚合来读取和编写查询需要一些时间来习惯:
select inv_num, portfolio, sum(balance) as balance,
round(sum(balance)/sum(sum(balance)) over (partition by portfolio),4.2)*100 as portfolio_perc
from Temp_analytic ta
group by inv_num, portfolio
order by inv_num;