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
;
그룹 기준으로 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 그룹
, 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
;