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)
但是,我发现使用子选择是低效的。有没有更快的方法来做到这一点?
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)