占总数的百分比:有没有比使用子选择更有效的方法?

Wil*_*son 0 performance oracle aggregate computed-column query-performance

我有一个现有的ASSET_SUMMARY_VW观点:

+-----------------------+---------------+
|      ASSET_TYPE       |     COST      |
+-----------------------+---------------+
| TRANSPORTATION        | 1,000,000,000 |
| TRANSPORTATION        |   500,000,000 |
| TRANSPORTATION        |   500,000,000 |
| ACTIVE TRANSPORTATION |   100,000,000 |
| ACTIVE TRANSPORTATION |    50,000,000 |
| STORMWATER MANAGEMENT |   500,000,000 |
+-----------------------+---------------+
Run Code Online (Sandbox Code Playgroud)

我想 GROUP BY 并计算每个ASSET_TYPE与总成本相比的百分比:

+-----------------------+---------------+------------------+
|      ASSET_TYPE       |     COST      | PERCENT_OF_TOTAL |
+-----------------------+---------------+------------------+
| TRANSPORTATION        | 2,000,000,000 |             75.4 |
| ACTIVE TRANSPORTATION |   150,000,000 |              5.6 |
| STORMWATER MANAGEMENT |   500,000,000 |             18.8 |
+-----------------------+---------------+------------------+
Run Code Online (Sandbox Code Playgroud)

我可以除以COST得到总成本的子选择:

SELECT 
    ASSET_TYPE
    ,SUM(COST) AS COST
    ,SUM(COST/(
               SELECT 
                   SUM(COST) 
               FROM 
                   USER.ASSET_SUMMARY_VW)
               ) AS PERCENT_OF_TOTAL
FROM 
    USER.ASSET_SUMMARY_VW
GROUP BY 
    ASSET_TYPE
Run Code Online (Sandbox Code Playgroud)

但是,我发现使用子选择是低效的。有没有更快的方法来做到这一点?

Bal*_*app 5

with data as
(
  select 'TRANSPORTATION' as asset_type, 2000000000 as cost from dual union all
  select 'ACTIVE TRANSPORTATION' as asset_type, 150000000 as cost from dual union all
  select 'STORMWATER MANAGEMENT' as asset_type, 500000000 as cost from dual
  )
select
  data.asset_type, data.cost, 
  trunc(ratio_to_report(data.cost) over () * 100, 1) as percent_of_total
from data;

ASSET_TYPE                  COST PERCENT_OF_TOTAL
--------------------- ---------- ----------------
TRANSPORTATION        2000000000             75.4
ACTIVE TRANSPORTATION  150000000              5.6
STORMWATER MANAGEMENT  500000000             18.8
Run Code Online (Sandbox Code Playgroud)

RATIO_TO_REPORT 仍然适用于您更新的数据:

with data as
(
  select 'TRANSPORTATION' as asset_type, 1000000000 as cost from dual union all
  select 'TRANSPORTATION' as asset_type, 500000000 as cost from dual union all
  select 'TRANSPORTATION' as asset_type, 500000000 as cost from dual union all
  select 'ACTIVE TRANSPORTATION' as asset_type, 100000000 as cost from dual union all
  select 'ACTIVE TRANSPORTATION' as asset_type, 50000000 as cost from dual union all
  select 'STORMWATER MANAGEMENT' as asset_type, 500000000 as cost from dual
  )
select
  data.asset_type, sum(data.cost), 
  trunc(ratio_to_report(sum(data.cost)) over () * 100, 1) as percent_of_total
from data
  group by data.asset_type
;

ASSET_TYPE            SUM(DATA.COST) PERCENT_OF_TOTAL
--------------------- -------------- ----------------
TRANSPORTATION            2000000000             75.4
ACTIVE TRANSPORTATION      150000000              5.6
STORMWATER MANAGEMENT      500000000             18.8
Run Code Online (Sandbox Code Playgroud)