【问题标题】:Analytical function using group by clause使用 group by 子句的分析函数
【发布时间】:2014-08-14 19:08:25
【问题描述】:

我想将数据分组到某个级别,然后应用分析函数来获得这个新级别相对于高于此级别的百分比贡献:-

我有一个表Temp_analytic 数据如下。该表中的数据遵循层次结构(portfolio和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

我正在使用一个分析函数 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

请帮忙。

【问题讨论】:

    标签: sql


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2021-11-11
      • 1970-01-01
      • 2011-09-25
      • 2023-03-28
      • 1970-01-01
      • 2013-08-31
      • 2012-12-07
      • 2015-05-28
      相关资源
      最近更新 更多