SELECT FUNCTION_DUEL(SUM(column_a),(SUM(column_b)+SUM(column_c))) AS column_d CASE WHEN column_e = DBMS_RANDOM.VALUE(5.00,5.99) THEN (column_d) -10 , || column_e = DBMS_RANDOM.VALUE(6.00,6.99) THEN (column_d) -11 , || column_e = DBMS_RANDOM.VALUE(7.00,7.99) THEN (column_d) -12 , || column_e = DBMS_RANDOM.VALUE(8.00,8.99) THEN (column_d) -13 , || column_e = DBMS_RANDOM.VALUE(9.00,9.99) THEN (column_d) -14 , || column_e = (column_e >= 10) ELSE (column_d) -15) END AS column_d FROM DUEL column_a, column_b, column_c 값을 위와 같이 구해서 column_d 라는 이름으로 저장하고 같은 테이블에 있는 column_e의 값이 5.00,5.99 사이일 경우 column_d의 값에서 -10을 빼주는 식을 CASE 문으로 만들려 하고 있습니다. 위 쿼리는 일단 제가 이런 저런 함수를 이용해서 만들어 보았는데 FROM 키워드가 필요한 위치에 없다는 에러메시지만 출력됩니다. 어떤 식으로 수정해야 하는지 도움 좀 요청 드릴게요
NUM | XD | VY | CV | DT | FG | NB |
1 | 김태희 | 79.52 | 79.59 | 430 | 1712 | 2 |
2 | 장동건 | 78.24 | 73.78 | 422 | 1734 | 2 |
3 | 송혜교 | 75.77 | 57.3 | 453 | 2272 | 70 |
4 | 박은지 | 75.21 | 71.75 | 402 | 1721 | 13 |
5 | 홍길동 | 73.47 | 57.43 | 427 | 1283 | 7 |
6 | 임꺽정 | 72.88 | 70.21 | 473 | 3423 | 87 |
7 | 장길산 | 71.22 | 47.75 | 415 | 2539 | 35 |
위 그림(실제 화면에 표시되는 정보)에 붉은 색 데이터의 값이
FUNCTION(SUM(컬럼1),(SUM(컬럼2)+SUM(컬럼3))) AS VY
쿼리문에 의해서 데이터 결과 값이 출력되고 있습니다.
그런데 같은 테이블의 MCD라는 컬럼에 있는 데이터의 값에 따라
저 VY 컬럼에 있는 값이 차감되도록 하는 쿼리를 만들고 싶습니다.
위 첨에 올린 게시물 내용 처럼 갑의 범위에 따라 -10, -11, -12 ......
이렇게 차감되도록이요.
컬럼1, 컬럼2, 컬럼3은 모두 NUMBER 형이고 아래와 같이 데이터가 들어가 있습니다.
컬럼1 | 컬럼2 | 컬럼3 |
12,950 | 5,049 | 1,682 |
45,735 | 22,582 | 3,615 |
59,420 | 26,530 | 5,374 |
25,181 | 13,466 | 2,822 |
15,629 | 8,598 | 2,552 |
마지막으로 아래는 펑션 스크립트입니다.
CREATE OR REPLACE FUNCTION FUNCTION_NAME
(
P_TCD IN NUMBER,
P_TPD IN NUMBER
)
RETURN NUMBER IS
VY NUMBER;
BEGIN
SELECT ROUND((P_TCD - P_TPD) / DECODE(P_TCD,0,'',P_TCD)*100,2) INTO VY
FROM DUAL;
RETURN VY;
END FUNCTION_NAME;
/
XD | 컬럼1 | 컬럼2 | 컬럼3 | MCD |
김태희 | 12,950 | 5,049 | 1,682 | 0.69 |
장동건 | 45,735 | 22,582 | 3,615 | 2.20 |
송혜교 | 59,420 | 26,530 | 5,374 | 5.50 |
박은지 | 25,181 | 13,466 | 2,822 | 7.33 |
홍길동 | 15,629 | 8,598 | 2,552 | 9.25 |
NUM | XD | VY | CV | DT | FG | NB |
1 | 김태희 | 79.52 | 79.59 | 430 | 1712 | 2 |
2 | 장동건 | 78.24 | 73.78 | 422 | 1734 | 2 |
3 | 송혜교 | 65.77 | 57.3 | 453 | 2272 | 70 |
4 | 박은지 | 63.21 | 71.75 | 402 | 1721 | 13 |
5 | 홍길동 | 59.47 | 57.43 | 427 | 1283 | 7 |
6 | 임꺽정 | 72.88 | 70.21 | 473 | 3423 | 87 |
7 | 장길산 | 71.22 | 47.75 | 415 | 2539 | 35 |
sum 을 사용한것은 전혀 이해가 가질 않네요.
일단 sum 제거하고 펑션을 수식으로 풀어보면
vy = ( c1 - (c2 + c3) ) / c1 * 100 인데요.
김태희의 값을 대입해보면 48.02 가 나오네요. 79.52 와는 상당한 차이가 나네요?
vy = ( 12950 - (5049 + 1682) ) / 12950 * 100 = 48.02
mcd 가 0.69 이므로 else 에 해당하는 15를 뺀다고 해도 79.52 라는 값이 나올 수 가 없네요?
명확한 기준을 제시해 주셔야 합니다.
또한, 나머지 cv, dt, fg, nb 는 또 어떤 기준으로 나오는건지? 전혀 설명이 없네요.
급하게 올리는라 정렬도 안하고 그냥 올린것 같습니다. ㅈㅅ합니다.
아래 다시 데이터 맞춰서 올린 내용입니다.
NUM | XD | VY |
1 | 김태희 | 69.52 |
2 | 장동건 | 68.24 |
3 | 송혜교 | 65.67 |
4 | 박은지 | 65.21 |
5 | 홍길동 | 63.46 |
6 | 임꺽정 | 62.88 |
7 | 장길산 | 61.22 |
XD | 컬럼1 | 컬럼2 | 컬럼3 | MCD |
김태희 | 18467 | 5597.25 | 32 | 3.33 |
장동건 | 16840 | 5330 | 18.25 | 4.45 |
송혜교 | 20030 | 6164.375 | 712 | 5.01 |
박은지 | 17033 | 5813.625 | 112.625 | 6.99 |
홍길동 | 11880 | 4310.875 | 29.875 | 7.88 |
임꺽정 | 26163 | 8413.625 | 1298.5 | 9.99 |
장길산 | 32147 | 12195.38 | 270.75 | 10.00 |
NUM | XD | VY |
1 | 김태희 | 69.52 |
2 | 장동건 | 68.24 |
3 | 송혜교 | 55.67 |
4 | 박은지 | 54.21 |
5 | 홍길동 | 51.46 |
6 | 임꺽정 | 48.88 |
7 | 장길산 | 46.22 |
WITH t AS ( SELECT '김태희' xd, 18467 c1, 5597.250 c2, 32.000 c3, 3.33 mcd FROM dual UNION ALL SELECT '장동건', 16840, 5330.000, 18.250, 4.45 FROM dual UNION ALL SELECT '송혜교', 20030, 6164.375, 712.000, 5.01 FROM dual UNION ALL SELECT '박은지', 17033, 5813.625, 112.625, 6.99 FROM dual UNION ALL SELECT '홍길동', 11880, 4310.875, 29.875, 7.88 FROM dual UNION ALL SELECT '임꺽정', 26163, 8413.625, 1298.500, 9.99 FROM dual UNION ALL SELECT '장길산', 32147, 12195.380, 270.750, 10.00 FROM dual ) SELECT ROW_NUMBER() OVER(ORDER BY vy DESC) num , xd, vy FROM (SELECT xd , vy - CASE WHEN mcd BETWEEN 5.00 AND 5.99 THEN 10 WHEN mcd BETWEEN 6.00 AND 6.99 THEN 11 WHEN mcd BETWEEN 7.00 AND 7.99 THEN 12 WHEN mcd BETWEEN 8.00 AND 8.99 THEN 13 WHEN mcd BETWEEN 9.00 AND 9.99 THEN 14 WHEN mcd >= 10.00 THEN 15 ELSE 0 END AS vy FROM (SELECT xd, c1, c2, c3, mcd , ROUND((c1 - (c2 + c3)) / NULLIF(c1, 0) * 100, 2) vy FROM t ) ) ;