2016-10-05 2 views
0

私は各kpi名、kpiの値、およびそれが属する月を持つファクト表を持っています。私は月ごとのレベルから年レベルに集計する必要があります。毎月ロールアップするために、確認されたディメンション表(時間ディメンション)を使用して、毎月の年を知るようにします。plsqlでの月間集計

私が直面している課題は、毎年ロールアップするときに必ずしも和(kpi値)を行うべきではありません。 avg、min、またはmaxは、kpiタイプに依存します。これは、kpiディメンションテーブルとkpi集計タイプを持つkpiディメンションテーブルを知ることになります。

集計タイプに関して、すべてのkpiについてこれをどのようにロールアップすることができるかを助けてください。

+0

集約のタイプを動的にするには、おそらく動的SQLを使用する必要があります(また、 'avg'を集計値の集合 - それはまれに数学的には正しい)。アーキテクチャ上、コードを書くことなく新しいKPIを定義できるとは思っていませんし、あるKPIを定期的に「平均」から「最小」に変更したいとは思いませんこれは、私がテーブルに保管するのが理にかなっているようなものではありません。 –

+0

私たちは、毎月の値をファクトテーブルに提供するディメンションテーブルにkpiのリストを持っています。 –

+0

@JustinCave - 動的なSQLが必要であるという疑問に対する答えを投稿しました。右?または私は何かを逃していますか? – mathguy

答えて

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が最後の行でヌルであり、dimテーブルでagg_typeクエリでハードコードされたものの中でなかった場合、それはまた、ヌルであろう;幸せ、ウェルの有限数があります定義された集約関数であるため、後者は避けることができます。)

+0

これは..ありがとう。 –