오라클 쿼리 질문드립니다. 0 2 567

by 고쿠 [2020.07.06 21:11:54]


지난번 질문드렸던 오라클 초보인데 제가 문제를 정확하게 인식못하고 질문드려 죄송합니다.

 

ID   A     B     C      D      E      F     G

1   0.1   1.2   20.3   3.5   1203   0.7   L1

2   0.2   1.3   20.5   3.6   1206   0.7   L1

3   0.1   1.4   20.3   3.3   1203   0.5   L2

4   0.3   1.1   20.6   3.5   1204   0.6   L3

5   0.2   1.2   20.4   3.4   1201   0.4   L2

6   0.4   1.5   20.3   3.3   1205   0.7   L4

7   0.1   1.3   20.5   3.6   1201   0.3   L5

8   0.3   1.4   20.4   3.2   1202   0.4   L1

9   0.4   1.1   20.2   3.7   1208   0.2   L6

10  0.5   1.5   20.7   3.1   1207   0.5   L2

                         .

                         .

                         .

위와같이 100건정도 데이터가있다고 가정하면, A ~ F까지 컬럼값을가지고

크게 AM, BM, CM, DM, EM 이렇게 나누려고하고, 각 세부조건은

 

--AM

NVL(SUM(CASE WHEN A <= 0.4 THEN

        (CASE WHEN B <= 1.2 THEN 

        (CASE WHEN C <= 20.3 THEN 

        (CASE WHEN D <= 3.2 THEN

        (CASE WHEN E BETWEEN 1203 AND 1206 THEN

        (CASE WHEN F BETWEEN 0.3 AND 0.6 THEN

        (CASE WHEN G = 'L1' THEN 1 ELSE 0 END)ELSE 0 END)ELSE 0 END)

        ELSE 0 END)ELSE 0 END)ELSE 0 END)ELSE 0 END),0) AS Y_5

        , NVL(SUM(CASE WHEN A <= 0.4 THEN

        (CASE WHEN B <= 1.2 THEN 

        (CASE WHEN C <= 20.3 THEN 

        (CASE WHEN D <= 3.2 THEN

        (CASE WHEN E BETWEEN 1203 AND 1206 THEN

        (CASE WHEN F BETWEEN 0.3 AND 0.6 THEN

        (CASE WHEN G = 'L2' THEN 1 ELSE 0 END)ELSE 0 END)ELSE 0 END)

        ELSE 0 END)ELSE 0 END)ELSE 0 END)ELSE 0 END),0) AS Y_2

        , NVL(SUM(CASE WHEN A <= 0.4 THEN

        (CASE WHEN B <= 1.2 THEN 

        (CASE WHEN C <= 20.3 THEN 

        (CASE WHEN D <= 3.2 THEN

        (CASE WHEN E BETWEEN 1203 AND 1206 THEN

        (CASE WHEN F BETWEEN 0.3 AND 0.6 THEN

        (CASE WHEN G NOT IN ('L1', 'L2') THEN 1 ELSE 0 END)ELSE 0 END)ELSE 0 END)ELSE 0 END)ELSE 0 

        END)ELSE 0 END)ELSE 0 END),0) AS Y_2_NOT

 

AM같은경우 위와같은 범위조건에 해당하는값이며, 나머지 BM, CM, DM, EM도 

AM처럼 3가지 SUM한값을 추출해내는데 범위값은 각각 다릅니다.

 

전체 100건에서 AM값을 추출한 전체값이 10이라면, AM을 제외한 나머지 90건의 데이터를 가지고 BM을 추출하고 추출한값이 20이라면 BM을 제외한 나머지 70건의 데이터를 가지고 다음 CM을 추출하고 추출한값이 15라면 나머지 55건의 데이터를 가지고 DM 20건을 추출하고 나머지 35건이 EM이 되도록해서

 

 

AM 

 

 

BM 

 

 

CM 

 

 

DM 

 

 

EM 

 

Y_5 

Y_2 

Y_2_NOT 

Y_5 

Y_2 

Y_2_NOT 

Y_5 

Y_2 

Y_2_NOT 

Y_5 

Y_2 

Y_2_NOT 

Y_5 

Y_2 

Y_2_NOT 

  2

  5 

     3 

 10 

  5 

     5 

  7 

  4 

     4 

  8 

  5 

     7 

 10 

 15 

    10 

 

위 표처럼 나타내고싶은데 오라클 초보라 막막하네요..

고수님들의 좋은 답변 기다리겠습니다.

by 마농 [2020.07.06 23:06:00]
WITH t AS
(
SELECT 1 id, 0.1 a, 1.2 b, 20.3 c, 3.5 d, 1203 e, 0.7 f, 'L1' g FROM dual
UNION ALL SELECT  2, 0.2, 1.3, 20.5, 3.6, 1206, 0.7, 'L1' FROM dual
UNION ALL SELECT  3, 0.1, 1.4, 20.3, 3.3, 1203, 0.5, 'L2' FROM dual
UNION ALL SELECT  4, 0.3, 1.1, 20.6, 3.5, 1204, 0.6, 'L3' FROM dual
UNION ALL SELECT  5, 0.2, 1.2, 20.4, 3.4, 1201, 0.4, 'L2' FROM dual
UNION ALL SELECT  6, 0.4, 1.5, 20.3, 3.3, 1205, 0.7, 'L4' FROM dual
UNION ALL SELECT  7, 0.1, 1.3, 20.5, 3.6, 1201, 0.3, 'L5' FROM dual
UNION ALL SELECT  8, 0.3, 1.4, 20.4, 3.2, 1202, 0.4, 'L1' FROM dual
UNION ALL SELECT  9, 0.4, 1.1, 20.2, 3.7, 1208, 0.2, 'L6' FROM dual
UNION ALL SELECT 10, 0.5, 1.5, 20.7, 3.1, 1207, 0.5, 'L2' FROM dual
)
SELECT COUNT(CASE WHEN gb1 = 'AM' AND gb2 = 'L1' THEN 1 END) am_y_5
     , COUNT(CASE WHEN gb1 = 'AM' AND gb2 = 'L2' THEN 1 END) am_y_2
     , COUNT(CASE WHEN gb1 = 'AM' AND gb2 = 'L3' THEN 1 END) am_y_2_not
     , COUNT(CASE WHEN gb1 = 'BM' AND gb2 = 'L1' THEN 1 END) bm_y_5
     , COUNT(CASE WHEN gb1 = 'BM' AND gb2 = 'L2' THEN 1 END) bm_y_2
     , COUNT(CASE WHEN gb1 = 'BM' AND gb2 = 'L3' THEN 1 END) bm_y_2_not
     , COUNT(CASE WHEN gb1 = 'CM' AND gb2 = 'L1' THEN 1 END) cm_y_5
     , COUNT(CASE WHEN gb1 = 'CM' AND gb2 = 'L2' THEN 1 END) cm_y_2
     , COUNT(CASE WHEN gb1 = 'CM' AND gb2 = 'L3' THEN 1 END) cm_y_2_not
     , COUNT(CASE WHEN gb1 = 'DM' AND gb2 = 'L1' THEN 1 END) dm_y_5
     , COUNT(CASE WHEN gb1 = 'DM' AND gb2 = 'L2' THEN 1 END) dm_y_2
     , COUNT(CASE WHEN gb1 = 'DM' AND gb2 = 'L3' THEN 1 END) dm_y_2_not
     , COUNT(CASE WHEN gb1 = 'EM' AND gb2 = 'L1' THEN 1 END) em_y_5
     , COUNT(CASE WHEN gb1 = 'EM' AND gb2 = 'L2' THEN 1 END) em_y_2
     , COUNT(CASE WHEN gb1 = 'EM' AND gb2 = 'L3' THEN 1 END) em_y_2_not
  FROM (SELECT id
             , a, b, c, d, e, f, g
             , CASE WHEN a <= 0.4
                     AND b <= 1.2
                     AND c <= 20.3
                     AND d <= 3.2
                     AND e BETWEEN 1203 AND 1206
                     AND f BETWEEN 0.3 AND 0.6
                    THEN 'AM'
                 -- WHEN .. BM 세부조건 .. THEN 'BM'
                 -- WHEN .. CM 세부조건 .. THEN 'CM'
                 -- WHEN .. DM 세부조건 .. THEN 'DM'
                    ELSE 'EM' END gb1
             , CASE WHEN g IN ('L1', 'L2') THEN g ELSE 'L3' END gb2
          FROM t
        )
;

 


by 고쿠 [2020.07.07 10:06:26]

답변 감사드립니다.

열심히 연구해 보겠습니다.^^

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