如何在Oracle查询中显示聚合值以及分解值?

时间:2015-08-20 19:15:35

标签: sql oracle group-by

我在Oracle中有一个简单的表,我希望以某种方式进行分组:我希望在同一行中显示分解结果和聚合结果。这是输入表:

regular table

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列之和连接的每一行。我不知道如何解释这一点,所以这里有它的样子:

grouped

给定行中的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

1 个答案:

答案 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 等函数,但它们计算每行的值而不是聚合结果。如果您想了解更多信息,他们还有其他一些有趣的选择:

https://oracle-base.com/articles/misc/analytic-functions

SQLFiddle example