plsql中的每月聚合

时间:2016-10-05 19:45:21

标签: plsql oracle11g aggregation

我有一个事实表,其中我有每个kpi名称,kpi的值和它所属的月份。我需要从月级到年级进行聚合。为了每月汇总,我将使用已确认的维度表(时间维度)来了解每个月的年份。

我面临的挑战是,当我每个月卷起时,我不应该总是做总和(kpi值)。它将是avg,min或max取决于kpi类型。我将了解kpi维度表,其中包含kpi名称和kpi聚合类型。

我需要一个帮助,如何针对其聚合类型为所有kpi进行滚动。

1 个答案:

答案 0 :(得分:2)

我不知道什么是KPI;这是一个如何运作的“概念证明”。

with
     dim ( kpi, agg_type ) as (
       select 1, 'max' from dual union all
       select 2, 'avg' from dual
     ),
     facts ( kpi, val ) as (
       select 1,  100 from dual union all
       select 1,  300 from dual union all
       select 2,   14 from dual union all
       select 2, null from dual union all
       select 2,   20 from dual union all
       select 3,  500 from dual
     )
select f.kpi, 
       case max(d.agg_type) when 'max' then max(f.val)
                            when 'avg' then avg(f.val)
                            else            null      end as agg_val
from dim d right outer join facts f on d.kpi = f.kpi
group by f.kpi
;

       KPI    AGG_VAL
---------- ----------
         1        300
         2         17 
         3

avg_val在最后一行为空,如果agg_type表中的dim不在查询中的硬编码中,则它也为空;愉快地,有一定数量的明确定义的聚合函数,因此可以避免后者。)