SELECT * FROM USER_SOURCE WHERE UPPER(TEXT) LIKE '%NET_DIE 1%'; WITH TESTA AS ( SELECT 1000 그룹, 'AAA' NAME, 0 IN_, 300 OUT, 1 POINT, 1 SEQ FROM DUAL UNION ALL SELECT 1000 그룹, 'AAA' NAME, 300 IN_, 300 OUT, 1 POINT, 2 SEQ FROM DUAL UNION ALL SELECT 1000 그룹, 'BBB' NAME, 300 IN_, 900000 OUT, 298 POINT, 3 SEQ FROM DUAL UNION ALL SELECT 1000 그룹, 'BBB' NAME, 900000 IN_, 900000 OUT, 1 POINT, 4 SEQ FROM DUAL UNION ALL SELECT 1000 그룹, 'BBB' NAME, 900000 IN_, 900000 OUT, 1 POINT, 5 ESQ FROM DUAL ) SELECT * FROM TESTA
그룹 | NAME | IN_ | OUT | POINT | SEQ |
1000 | AAA | 0 | 300 | 1 | 1 |
1000 | AAA | 300 | 300 | 1 | 2 |
1000 | BBB | 300 | 900000 | 298 | 3 |
1000 | BBB | 900000 | 900000 | 1 | 4 |
1000 | BBB | 900000 | 900000 | 1 | 5 |
1000 이라는 그룹에서 POINT가 1이 아닌 SEQ 를기준으로
그 SEQ보다 낮은 행의 IN, OUT 컬럼에 298이라는 1이 아닌것의 기준이되는 POINT 를 곱해주고싶습니다.
예시처럼 POINT가 1보다 클 때의 SEQ가 3 이라면
IN은 1,2,3 모두 POINT를 곱해지고,
OUT 은 3을 제외한 1,2 에 POINT를 곱해지게 하려합니다.
여러가지 시도해봤는데 해결하지 못해 도움 요청합니다.
SQL 로직 상으로 해결이 불가능한건가요?
감사합니다.
밑에는 원하는 차트 입니다
IN컬럼과 OUT 컬럼이 1을 초과한 POINT인 298로 곱해집니다.
그룹 | NAME | IN_ | OUT | POINT | SEQ |
1000 | AAA | 0 | 894000 | 1 | 1 |
1000 | AAA | 894000 | 894000 | 1 | 2 |
1000 | BBB | 894000 | 900000 | 298 | 3 |
1000 | BBB | 900000 | 900000 | 1 | 4 |
1000 | BBB | 900000 | 900000 | 1 | 5 |
1 이 아닌 값은 오직 1개 뿐인가요?
혹시 여러개 있지는 않은지?
여러개 가능하다면 결과는 어떤 형태로 나오게 되는지?
WITH testa AS ( SELECT 1000 그룹, 'AAA' name, 0 in_, 300 out, 1 point, 1 seq FROM DUAL UNION ALL SELECT 1000, 'AAA', 300, 300, 1, 2 FROM dual UNION ALL SELECT 1000, 'BBB', 300, 900000, 298, 3 FROM dual UNION ALL SELECT 1000, 'BBB', 900000, 900000, 1, 4 FROM dual UNION ALL SELECT 1000, 'BBB', 900000, 900000, 1, 5 FROM dual ) SELECT a.그룹 , a.name , a.in_ * CASE WHEN a.seq <= b.seq THEN b.point ELSE 1 END in_ , a.out * CASE WHEN a.seq < b.seq THEN b.point ELSE 1 END out , a.point , a.seq FROM testa a , testa b WHERE a.그룹 = b.그룹 AND b.point != 1 ORDER BY a.그룹, a.seq ;
WITH testa AS ( SELECT 1000 그룹, 'AAA' name, 0 in_, 300 out, 1 point, 1 seq FROM DUAL UNION ALL SELECT 1000, 'AAA', 300, 300, 1, 2 FROM dual UNION ALL SELECT 1000, 'BBB', 300, 900000, 298, 3 FROM dual UNION ALL SELECT 1000, 'BBB', 900000, 900000, 1, 4 FROM dual UNION ALL SELECT 1000, 'BBB', 900000, 900000, 1, 5 FROM dual ) SELECT 그룹 , name , in_ * CASE WHEN seq <= m_seq THEN m_point ELSE 1 END in_ , out * CASE WHEN seq < m_seq THEN m_point ELSE 1 END out , point , seq FROM (SELECT 그룹, name, in_, out, point, seq , MAX(point) OVER(PARTITION BY 그룹) m_point , MAX(CASE WHEN point > 1 THEN seq END) OVER(PARTITION BY 그룹) m_seq FROM testa ) ORDER BY 그룹, seq ;