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을 사용해야 할 것입니다. (실제로는 '평균'을 적용하는 것에 대해 신중해야합니다. 집계 값의 집합 - 이것은 거의 수학적으로 정확하지 않음). 구조적으로 코드를 작성하지 않고도 새 KPI를 정의 할 수있을 것이라고 기대하지는 않습니다. 한 KPI를 정기적으로 '평균'에서 '최소'로 변경하려고합니다. 이것은 내가 테이블에 저장하는 것이 의미가있는 일이 아닙니다. –
우리는 사용자가 매월 값을 사실 테이블에 제공 할 차원 테이블에 kpi 목록을 가지고 있습니다. –
@JustinCave - 내가 게시 한 "개념 증명"이 동적 SQL을 필요로하는지에 대한 의문에 대답한다고 가정합니다. 권리? 또는 나는 무엇인가 놓치고 있냐? – mathguy