[오라클 초보] CASE 문 관련해서 문의 드립니다. 0 9 3,194

by NExT맨 [SQL Query] [2013.01.22 14:40:35]


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 키워드가 필요한 위치에 없다는 에러메시지만 출력됩니다.

어떤 식으로 수정해야 하는지 도움 좀 요청 드릴게요
by 부쉬맨 [2013.01.22 15:05:06]
SELECT 
FUNCTION_DUEL(SUM(column_a),(SUM(column_b)+SUM(column_c))) AS column_d,

밑에 case 문장도 다 틀렸네요 
|| <-- 이게 when 으로 들어가야될꺼같은데...


by 마농 [2013.01.22 15:16:40]

문법도 엉망이고,
별칭을 같은 레벨에서 재사용하는 것도 불가능하고
a,b,c 에는 그룹함수를 사용하고 e 에는 사용을 안했는데...
이게 개념상 맞는 것인지 틀린것인지 판단이 불가능한 상태로...
랜덤함수는 또 왜 사용했는지 의문이구요.

쿼리를 보고 조언을 드리기 힘든 상황입니다.
이럴땐 차라리 쿼리는 접어두고, 데이터만 가지고 질문하시는게 나을 것입니다.
원본자료와 원하는 결과자료를 비교해서 보여주고 설명해 주세요.


by NExT맨 [2013.01.22 16:50:17]

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;
/


by NExT맨 [2013.01.22 17:04:54]

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


by 마농 [2013.01.22 18:07:13]

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 는 또 어떤 기준으로 나오는건지? 전혀 설명이 없네요.


by NExT맨 [2013.01.22 18:50:16]

급하게 올리는라 정렬도 안하고 그냥 올린것 같습니다. ㅈㅅ합니다.

아래 다시 데이터 맞춰서 올린 내용입니다.

NUM XD VY
1 김태희 69.52
2 장동건 68.24
3 송혜교 65.67
4 박은지 65.21
5 홍길동 63.46
6 임꺽정 62.88
7 장길산 61.22


 이렇게 데이터가 있구요. (위 댓글에 CV나 DT 등은 상관 없는 컬럼이었습니다.)
공식은 위에 설명한데로    FUNCTION(SUM(컬럼1),(SUM(컬럼2)+SUM(컬럼3))) AS VY
이렇게 되어 있습니다.
 (저 공식은 제가 짠건 아니고 기존에 있던 개발자 분들이 저렇게 짜 놓은걸로 알고 있습니다.)

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

DB에 위와 같이 데이터가 있고 MCD가 컬럼의 값에 따라 아래와 같이
화면이 출력되도록 하는게 목표입니다. (모든 수치는 소수점 세 번째 자리에서 반올림하도록 처리되어 있습니다.)

NUM XD VY
1 김태희 69.52
2 장동건 68.24
3 송혜교 55.67
4 박은지 54.21
5 홍길동 51.46
6 임꺽정 48.88
7 장길산 46.22


by 아린 [2013.01.22 19:09:46]
 WITH t(xd, c1, c2, c3, mcd) AS(
SELECT '김태희',    18467,    5597.25  ,    32     ,   3.33 FROM dual UNION ALL
SELECT '장동건',    16840,    5330     ,    18.25  ,   4.45 FROM dual UNION ALL
SELECT '송혜교',    20030,    6164.375 ,   712     ,   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.5  ,   9.99 FROM dual UNION ALL
SELECT '장길산',    32147,    12195.38 ,   270.75  ,  10.00 FROM dual
)
SELECT xd, vy, mcd
            , CASE WHEN mcd BETWEEN 5 AND 5.99 THEN vy-10
                        WHEN mcd BETWEEN 6 AND 6.99 THEN vy-11  
                        WHEN mcd BETWEEN 7 AND 7.99 THEN vy-12
                        WHEN mcd BETWEEN 8 AND 8.99 THEN vy-13
                        WHEN mcd BETWEEN 9 AND 9.99 THEN vy-14
                        WHEN mcd >= 10                          THEN vy-15
                        ELSE vy
               END vy_cal            
   FROM (SELECT xd, ROUND((c1-(c2+c3))/c1*100,2) vy, mcd
               FROM t
               )   

by 마농 [2013.01.22 19:12:24]
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
                )
        )
;

by NExT맨 [2013.01.23 09:08:51]
감사합니다.

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