지난번 질문드렸던 오라클 초보인데 제가 문제를 정확하게 인식못하고 질문드려 죄송합니다.
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 |
위 표처럼 나타내고싶은데 오라클 초보라 막막하네요..
고수님들의 좋은 답변 기다리겠습니다.
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 ) ;