plsql中的月到年聚合

plsql中的月到年聚合,plsql,oracle11g,aggregation,Plsql,Oracle11g,Aggregation,我有一个事实表,其中有每个kpi名称、kpi值及其所属月份。我需要从月份级别到年度级别进行聚合。对于从月份到年份的滚动,我将使用确认维度表(时间维度)来了解每个月的年份 我面临的挑战是,我不应该总是在逐月汇总时进行汇总(kpi值)。它将是平均值、最小值或最大值,具体取决于kpi类型。下面我将了解kpi维度表,其中包含kpi名称和kpi聚合类型 我需要一个帮助,告诉我如何根据聚合类型对所有kpi进行汇总 我不知道什么是KPI;这是一个如何工作的“概念证明” with dim ( kpi,

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

我面临的挑战是,我不应该总是在逐月汇总时进行汇总(kpi值)。它将是平均值、最小值或最大值,具体取决于kpi类型。下面我将了解kpi维度表,其中包含kpi名称和kpi聚合类型


我需要一个帮助,告诉我如何根据聚合类型对所有kpi进行汇总

我不知道什么是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
在最后一行为null,如果
dim
表中的
agg_type
不在查询中硬编码的范围内,那么它也将为null;幸运的是,定义良好的聚合函数数量有限,因此可以避免后者。)

我不知道什么是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
在最后一行为null,如果
dim
表中的
agg_type
不在查询中硬编码的范围内,那么它也将为null;幸运的是,有有限数量的定义良好的聚合函数,因此可以避免后者。)

如果希望聚合类型是动态的,那么可能需要使用动态SQL(我会非常谨慎地将
avg
应用于一组聚合值——这在数学上很少是正确的)。在建筑上,我不希望您能够在不编写代码的情况下定义新的KPI,也不希望您经常希望将一个KPI从汇总为
avg
更改为
min
,因此这类事情存储在表中对我来说没有意义。我们在一个维度表中为用户提供了KPI列表将向事实提供每个月的值table@JustinCave-我假设我发布的“概念证明”回答了关于需要动态SQL的疑问。对吗?还是我遗漏了什么?@mathguy-可能。我对这个问题的理解不同,但我猜你的解释是正确的。我仍然不相信尝试动态指定聚合函数的有用性,也不相信将每月KPI平均为年度值的数学正确性,但您可能不需要动态SQL—我完全同意您的所有观点。{:-)如果希望聚合类型是动态的,那么可能需要使用动态SQL(我会非常谨慎地将
avg
应用于一组聚合值——这在数学上很少是正确的)。在体系结构上,我不希望您能够在不编写代码的情况下定义新的KPI,也不希望您经常希望将一个KPI从汇总为
avg
更改为
min
,因此这类事情存储在表中对我来说没有意义。我们在维度表中有KPI列表用户将向事实提供每个月的值table@JustinCave-我假设“概念证明”我发布了关于需要动态SQL的疑问的答案。对吗?还是我遗漏了什么?@mathguy-可能。我对这个问题的理解有所不同,但我猜你的解释是正确的。我仍然不相信尝试动态指定聚合函数的有用性,也不相信平均每月KP的数学正确性是年度值,但您可能不需要动态SQL。@JustinCave-我完全同意您的所有观点。{:-)