2015-10-20 53 views
3

实例数据(完整的表有行更多的列数以百万计):的Oracle SQL GROUP BY CUBE具有鲜明的ID

invoice_number |year   |department  |euros 
------------------------------------------------------------- 
1234   |2010   |1    | 200 
1234   |2011   |1    | 200 
1234   |2011   |2    | 200   
4567   |2010   |1    | 450 
4567   |2010   |2    | 450 
4567   |2010   |3    | 450 

我的目的:

我要总结的欧元每年和每个可能的组合中的每个部门。

结果应该如何看待:

year    |department   |euros 
-------------------------------------------- 
2010    |1     |650 
2010    |2     |450 
2010    |3     |450 
2010    |(null)    |650 
2011    |1     |200 
2011    |2     |200 
(null)   |1     |650 
(null)   |2     |650 
(null)   |3     |450 
(null)   |(null)    |650 

我的查询:

select  year 
,   department 
,   sum(euros) 
from  table1 
group by cube (
        year 
      ,  department 
        ) 

问题:

一个发票号码可以发生在几类。例如,一张发票可以有2010年和2011年的项目。当我想每年显示数据时,这没有问题。但是,当我想要总计所有年份的欧元总计两次,每年一次。我想要“按立方体分组”的功能,但我只想汇总不同的发票号码。

问题表:

year    |department   |euros 
-------------------------------------------- 
2010    |1     |650 
2010    |2     |450 
2010    |3     |450 
2010    |(null)    |1550 
2011    |1     |200 
2011    |2     |200 
(null)   |1     |850 
(null)   |2     |650 
(null)   |3     |450 
(null)   |(null)    |1950 

是否有可能做我想做什么?到目前为止,我的搜索没有结果。我创建了一个SQL Fiddle,我希望它的工作原理

回答

1

[删除以前的“解决方案”]

新尝试:这里是一个非常丑陋的解决方案,但它似乎工作,即使两张发票有相同数量。有两个表访问,你应该检查性能是否可以接受。

SQL> with table1_cubed as 
    2 (select year 
    3   , department 
    4   , grouping_id(year,department) gid 
    5  from table1 
    6  group by cube(year,department) 
    7 ) 
    8 , join_distinct_invoices as 
    9 (select distinct x.* 
10   , r.invoice_number 
11   , r.euros 
12  from table1_cubed x 
13   inner join table1 r on (nvl(x.year,r.year) = r.year and nvl(x.department,r.department) = r.department) 
14 ) 
15 select year 
16  , department 
17  , sum(euros) 
18 from join_distinct_invoices 
19 group by year 
20  , department 
21  , gid 
22 order by year 
23  , department 
24/

     YEAR DEPARTMENT   SUM(EUROS) 
---------- -------------------- ---------- 
     2010 1       650 
     2010 2       450 
     2010 3       450 
     2010        650 
     2011 1       200 
     2011 2       200 
     2011        200 
      1       650 
      2       650 
      3       450 
             650 

11 rows selected. 
+0

目前正在测试您的新解决方案以提升性能。 – Elisa

+1

当我添加更多数据列时性能下降(显然)。当我添加所有列时,多维数据集组生成287.912行。对于一个较小的组,我'只'有4.488行。第二个有一个可以接受的表现,第一个没有。但解决方案似乎工作。 – Elisa

0
select year 
     ,department 
     ,case when GROUPING_id(year,department) in (3) then sum(dist_euro) else sum(euros) end sums 
     ,decode(GROUPING_id(year,department),0,'NO GROUP',1,'DEPARTMENT IS NULL',2,'YEAR IS NULL',3,'TOTAL OVER ALL YEARS') info 
     from (
select  year 
      ,   department 
      ,   euros 
      ,case when row_number() over(partition by year order by year) = 1 then euros else 0 end dist_euro 
from table1) 
group by cube (
        year 
      ,  department 
        ) 
     order by GROUPING_id(year,department) 
+0

这将工作,如果我只想'年'栏的总和。但是,我希望这可能为每列(所以在这个例子中也为部门)和我的真实数据集中的其他7列。通过您的查询,部门中(null)的总和仍然不正确。 – Elisa