使用group by子句的分析函数

时间:2014-06-24 13:32:52

标签: sql

我想将数据分组到某个级别,然后应用分析函数来获得此级别的百分比贡献超过此级别: -

我有一个表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

请帮忙。

1 个答案:

答案 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;