您可以用单一扫描做你的表:
with test(ItemCode, ItemNo, ItemTotal) as
(
select 'CT1', 'A', 20 from dual union all
select 'CT1', 'A', 30 from dual union all
select 'CT2', 'A', 40 from dual union all
select 'CT2', 'A', 10 from dual
)
select ItemCode, ItemNo,
ItemTotal/sum(ItemTotal) over (partition by ItemCode,ItemNo)
from test
为了完整起见,如果你想与一个加入一个解决方案,你可以使用:
select ItemCode,ItemNo, t1.ItemTotal/sum(t2.ItemTotal)
from test t1
inner join test t2
using(ItemCode,ItemNo)
group by ItemCode, ItemNo, t1.ItemTotal
然而这两种方法有不同的表现;对于加盟的解决方案计划:
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8 | 336 | 8 (25)| 00:00:01 |
| 1 | HASH GROUP BY | | 8 | 336 | 8 (25)| 00:00:01 |
|* 2 | HASH JOIN | | 8 | 336 | 7 (15)| 00:00:01 |
| 3 | TABLE ACCESS FULL| TEST | 4 | 84 | 3 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL| TEST | 4 | 84 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------
,为单次扫描解决方案:
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 84 | 4 (25)| 00:00:01 |
| 1 | WINDOW SORT | | 4 | 84 | 4 (25)| 00:00:01 |
| 2 | TABLE ACCESS FULL| TEST | 4 | 84 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
显示我们预期的结果,格式化的方式为您的样本数据相同。 – jarlh
@jarlh编辑!我缩短了表格并添加了我的预期结果 –
这个问题的问题在于,标题和开头词语预先假定自联接是问题解决方案的必需部分。一旦实际描述问题,很明显自联接可能不相关。 –