ORACLE 쿼리 질문합니다~ 0 7 5,276

by RedOri [SQL Query] ORACLE [2015.04.07 17:02:02]


(100 / 50 ) * 100 = 200%

위의 결과값인 200%를 아래와 같은 구조의 테이블에서  BUNUS 값을 구해올려고 하는데 쿼리를 어떻게 짜야할지

떠오르질 않아 질문드립니다. TT 도움 부탁드립니다

ACHIEVE      BONUS

5%                0%

10%               5%

20%               6%

30%               7%

40%               8%

140%              100%

140% 이상은 100%

by 창조의날개 [2015.04.07 17:08:42]

해당 테이블에서 어떤 기준으로 결과를 가져 오나요?

ACHIEVE에 따라 BONUS 값을 계산하는 것이지?

계산하는 방법이나 기준이 뭔가요?


UPDATE 테이블명
SET BONUS = CASE WHEN ACHIVE >= '140%' THEN '100%'
                 ELSE 계산식
            END
;

 


by RedOri [2015.04.07 17:12:33]

ACHIEVE, BONUS 는 관리자가 엑셀로 업로드 해두는 형식이며, 위의 계산에서 나온 결과값이

ACHIEVE 에 해당하는 BONUS의 값을 구해와야 합니다.

계산 결과값이 ACHIEVE의 맥스이상이면 ACHIEVE의 맥스값을 가져오면 됩니다 T-T

UPDATE 가 필요한게 아니고 SELECT하여 해당하는 BONUS 값이 필요합니다 TT


by rain748 [2015.04.07 17:33:39]

with t(ACHIEVE,BONUS) as(
select 5, 0 from dual union all
select 10, 5 from dual union all
select 20, 6 from dual union all
select 30, 7 from dual union all
select 40, 8 from dual union all
select 140, 100 from dual)
select bonus
from (
select v,achieve,bonus
from t
model return updated rows
dimension by (rownum n)
measures (cast(0 as number) v,achieve,bonus)
ignore nav
rules (
v[any] = achieve[cv() - 1]
))
where least((100 / 50 ) * 100 ,140) between v+1 and achieve
;


by 창조의날개 [2015.04.07 17:36:37]

WITH TT(ACHIEVE, BONUS) AS (
    SELECT 5,   0 FROM DUAL UNION ALL
    SELECT 10,  5 FROM DUAL UNION ALL
    SELECT 20,  6 FROM DUAL UNION ALL
    SELECT 30,  7 FROM DUAL UNION ALL
    SELECT 40,  8 FROM DUAL UNION ALL
    SELECT 140, 100 FROM DUAL
)
SELECT SS.ACHIEVE
     , CASE WHEN SS.ACHIEVE >= (SELECT MAX(ACHIEVE) FROM TT) THEN (SELECT MAX(BONUS) FROM TT)
                 ELSE TT.BONUS
            END AS BONUS
FROM TT
   , (SELECT (100 / 50 ) * 100 AS ACHIEVE FROM DUAL) SS
WHERE TT.ACHIEVE(+) = SS.ACHIEVE
;

 


by 마농 [2015.04.07 17:48:35]
WITH code_t AS
(
SELECT 5 achieve, 0 bonus FROM dual
UNION ALL SELECT  10,   5 FROM dual
UNION ALL SELECT  20,   6 FROM dual
UNION ALL SELECT  30,   7 FROM dual
UNION ALL SELECT  40,   8 FROM dual
UNION ALL SELECT 140, 100 FROM dual
)
, data_t AS
(
SELECT (100 / 50 ) * 100 v FROM dual
)
SELECT d.v
     , MAX(achieve) achieve
     , MAX(bonus) bonus
  FROM data_t d
     , code_t c
 WHERE d.v >= c.achieve
;

 


by 창조의날개 [2015.04.07 18:05:19]

code_t 테이블에 없는 V 값이 들어왔을 경우 예상하지 못한 결과가 나올 수 있을거 같네요..

업무 내용에 따라 오히려 필요 할수도 있겠네요..


by RedOri [2015.04.07 18:14:54]

도움 주신분들 감사합니다. ^^

SELECT MAX(A.BONUS_RATE) FROM (select ACHIEVE_RATE, BONUS_RATE FROM TB_ENG_REPORT_BRACKET ) A WHERE  A.ACHIEVE_RATE  <= '계산결과값'

요렇게 처리했습니다. 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입