plsql 中的月度汇总

Month to year Aggregation in plsql

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

我面临的挑战是,当我从月到年汇总时,我不应该总是做 sum(kpi 值)。它将是 avg、min 或 max,具体取决于 kpi 类型。我将了解 kpi 维度 table,它具有 kpi 名称和 kpi 聚合类型。

我需要帮助才能针对所有 kpi 的聚合类型进行汇总。

我不知道什么是KPI;这是一个 "proof of concept" 这可能是如何工作的。

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 在最后一行为空,如果 dim table 中的 agg_type 不在那些硬-在查询中编码;幸运的是,定义明确的聚合函数的数量是有限的,因此可以避免后者。)