안녕하세요
기본 | 1차 | 2차 | 3차 | |
곱하기 | - | 2 | 2 | 5 |
수량 | 100 | 200 | 400 | 2000 |
하기와 같은 형식으로
1차의 수량에는 기본 * 1차 곱
2차의 수량에는 1차 수량 * 2차 곱
3차의 수량에는 2차 수량 * 3차 곱
이렇게 계산되어 나온 숫자로 연쇄 계산을 적용할 수 있는 방법 이 있나요?
혹시 있다면 도움 부탁드립니다.. 샘플 남길게요..
with a as (select 0 as base, 5 as one, 10 as two, 15 as three from dual union all select 100 as base, 0 as one, 0 as two, 0 as three from dual ) select * from a
원하는 값입니다..
with a as (select 0 as base, 5 as one, 10 as two, 15 as three from dual union all select 100 as base, 500 as one, 5000 as two, 75000 as three from dual ) select * from a
테이블 구조가 인위적이네요.
1 행과 2행의 역할과 항목수가 다른데
서로 다른 속성값을 하나의 컬럼안에 표현을 하고 있네요.
행을 구분하는 구분값도 없구요
정규화를 하면 기본 수량 테이블 하나
- 100
차수별 곱하기수 테이블 하나 있어야 할 듯 하네요.
- 1, 5
- 2, 10
- 3, 15
그러면 누적 곱 형태로 구현이 가능한데.
지금 형태에서는 그냥 노가다성으로 계산식 적어주는게 차라리 간단합니다.
WITH a AS ( SELECT 0 base, 5 one, 10 two, 15 three FROM dual UNION ALL SELECT 100, 0, 0, 0 FROM dual ) SELECT base , CASE WHEN base = 0 THEN one ELSE base * MAX(one ) OVER() END one , CASE WHEN base = 0 THEN two ELSE base * MAX(one*two ) OVER() END two , CASE WHEN base = 0 THEN three ELSE base * MAX(one*two*three) OVER() END three FROM a ;
WITH t AS ( SELECT 0 seq, 100 v FROM dual UNION ALL SELECT 1, 5 FROM dual UNION ALL SELECT 2, 10 FROM dual UNION ALL SELECT 3, 15 FROM dual ) -- 누적 곱 예시 -- SELECT seq , v , ROUND(EXP(SUM(LN(v)) OVER(ORDER BY seq))) x FROM t ;