繁体   English   中英

使用group by子句的分析功能

[英]Analytical function using group by clause

我想将数据分组到某个级别,然后应用解析函数以获取高于此级别的新级别的百分比贡献:

我有一个表Temp_analytic数据,如下所示。 该表中的数据遵循层次结构(组合和inv_num具有一对多关系,而inv_num和loan_num具有一对多关系。

将Loan_num汇总到Inv_num,然后将inv_num进一步汇总到Portfolio

因此,基本数据处于贷款级别。 我将数据分组到“投资者”级别,并希望看到每个投资者对投资组合的百分比贡献

基础数据

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

我正在使用分析函数按投资组合划分总和

询问

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

请帮忙。

你有正确的主意。 但是,请先使用子查询来汇总数据,然后再使用解析函数:

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM