2016-10-05 3 views
0

각 kpi 이름, kpi 값 및 해당 월이 속한 사실 테이블이 있습니다. 나는 달 수준에서 년 수준에 집합을 할 필요가있다. 매월 롤업하기 위해 확인 된 차원 테이블 (시간 차원)을 사용하여 매월의 연도를 알 수 있습니다.월간 plsql 집계

내가 직면하고있는 도전은, 나는 매월 롤업 할 때 항상 합계 (kpi 값)을해서는 안됩니다. 평균, 최소 또는 최대 값은 kpi 유형에 따라 다릅니다. 이것은 kpi 이름과 kpi 집계 유형이있는 kpi 차원 테이블을 알게 될 것입니다.

집계 유형과 관련하여 모든 kpi에 대해이 작업을 수행하는 방법에 대한 도움이 필요합니다.

+0

집계 유형을 동적으로 만들려면 동적 SQL을 사용해야 할 것입니다. (실제로는 '평균'을 적용하는 것에 대해 신중해야합니다. 집계 값의 집합 - 이것은 거의 수학적으로 정확하지 않음). 구조적으로 코드를 작성하지 않고도 새 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는 마지막 행에 널 (null)이며, dim 테이블의 agg_type이 가운데 아니었다 경우는 null이 될 것입니다 쿼리에 하드 코딩 된 사람, 행복하게 잘 유한 수있다 정의 된 집계 함수이므로 후자를 피할 수 있습니다.)

+0

이 작품 .. 감사합니다. –