Oracle逐行求和

时间:2013-05-30 06:48:16

标签: sql oracle aggregate-functions

我有一个存储过程,它返回一个组中的分类数据。现在问题是我需要对一个组的类别数据求和并将其插入一个类别的开头。例如:

Group   Category    X1  X2  X3  X4
========================================================
A       A1          1   1   1   1
----------------------------------------------------
A       A2          1   1   1   1
---------------------------------------------------
B       B1          1   1   1   1
----------------------------------------------------
B       B2          1   1   1   1
----------------------------------------------------

应显示为:

Group   Category    X1  X2  X3  X4
=======================================================
A           A       2   2   2   2
----------------------------------------------------
A           A1      1   1   1   1
----------------------------------------------------
A           A2      1   1   1   1
----------------------------------------------------
B           B       2   2   2   2
----------------------------------------------------
B           B1      1   1   1   1
----------------------------------------------------
B           B2      1   1   1   1
----------------------------------------------------

所有这一切都需要在一个程序中完成。我不能使用临时表。

3 个答案:

答案 0 :(得分:3)

您可以使用GROUP BY ROLLUP()执行多个级别的聚合,包括根本不包含聚合:

select
  grp,
  coalesce(cat,grp) cat,
  sum(x1),
  sum(x2),
  sum(x3),
  sum(x4)
from
  my_table
group by grp,
  rollup(cat)
order by
  grp,
  cat nulls first;

http://sqlfiddle.com/#!4/4d9c4/8

答案 1 :(得分:1)

请尝试:

select 
    * 
from YourTable
union all
select 
    "Group", "Group" as Category, 
    SUM(X1), 
    SUM(X2),
    SUM(X3),
    SUM(X4)
from YourTable
Group by "Group"
order by "Group", Category

答案 2 :(得分:0)

我猜你只想要像

这样的东西
SELECT *
  FROM (
    SELECT group, category, x1, x2, x3, x4
      FROM your_table
    UNION ALL
    SELECT group, group, sum(x1), sum(x2), sum(x3), sum(x4)
      FROM your_table
     GROUP BY group
    )
 ORDER BY group, category

当然,您需要使用实际的列名称 - “GROUP is a reserved word so you cannot have a column named GROUP”。