我在Oracle中有一个简单的表,我希望以某种方式进行分组:我希望在同一行中显示分解结果和聚合结果。这是输入表:
with abc as
(
select 'aaa' nnn, 100 amt from dual union
select 'aaa', 20 from dual union
select 'aaa', 3 from dual union
select 'bbb', 44 from dual
)
select * from abc
我想显示与NNN列分组的AMT列之和连接的每一行。我不知道如何解释这一点,所以这里有它的样子:
给定行中的Sum列将等于所有行的AMT列值的总和,其中NNN值等于同一给定行中的NNN值。
我可以通过使用下面的查询将输入表与其自身的分组版本相连来实现此目的,但我认为这很麻烦。我的问题是:Oracle中是否有内置函数来实现这一目标? (虽然我有很多SQL Server经验,但我的Oracle体验有点弱。)
with abc as
(
select 'aaa' nnn, 100 amt from dual union
select 'aaa', 20 from dual union
select 'aaa', 3 from dual union
select 'bbb', 44 from dual
)
select tblLeft.nnn, tblLeft.amt, tblRight.amtSum
from
(
select nnn, amt from abc
) tblLeft
inner join
(
select nnn, sum(amt) amtSum
from abc
group by nnn
) tblRight on tblLeft.nnn = tblRight.nnn
答案 0 :(得分:2)
您可以使用分析功能来实现目标:
with abc as
(
select 'aaa' nnn, 100 amt from dual union
select 'aaa', 20 from dual union
select 'aaa', 3 from dual union
select 'bbb', 44 from dual
)
select nnn,
amt,
sum(amt) over (partition by nnn)
from abc;
输出:
NNN AMT SUM(AMT)OVER(PARTITIONBYNNN)
aaa 3 123
aaa 20 123
aaa 100 123
bbb 44 44
分析函数的作用是:它们允许您使用 SUM 等函数,但它们计算每行的值而不是聚合结果。如果您想了解更多信息,他们还有其他一些有趣的选择: