아래와 같이 TABLE에 값이 존재합니다.
제가 원하는 결과물은
ID가 159에서 시작하여 160 또는 161의 마지막값까지 SUM을 쿼리를
구현하고 싶은데, 쉽지 않아 고수님들의 도움을 받고자 합니다.
ID | DEPT | VALUE |
159 | AAA | 10 |
159 | AAA | 1 |
159 | AAA | 2 |
159 | AAA | 3 |
159 | AAA | 4 |
161 | AAA | 5 |
161 | AAA | 6 |
159 | AAA | 20 |
159 | AAA | 1 |
159 | AAA | 2 |
160 | AAA | 3 |
159 | AAA | 1 |
159 | AAA | 2 |
161 | AAA | 3 |
결과값
SEQ | DEPT | VALUE |
1 | AAA | 31 |
2 | AAA | 26 |
3 | AAA | 6 |
위와 같이 가능할까요?
고수님들 도와 주십시오.
우선 해당 요구사항을 만족하기 위한 전제조건으로
일련번호나 날짜 등과 같은 정렬용 필드가 추가로 표현되어야만 합니다.
그리고, DB 종류에 따라 구문이 다르니, 질문 시 DB 종류와 버전을 명시해 주세요.
-- Oracle -- WITH t AS ( SELECT 1 idx, 159 id, 'AAA' dept, 10 val FROM dual UNION ALL SELECT 2, 159, 'AAA', 1 FROM dual UNION ALL SELECT 3, 159, 'AAA', 2 FROM dual UNION ALL SELECT 4, 159, 'AAA', 3 FROM dual UNION ALL SELECT 5, 159, 'AAA', 4 FROM dual UNION ALL SELECT 6, 161, 'AAA', 5 FROM dual UNION ALL SELECT 7, 161, 'AAA', 6 FROM dual UNION ALL SELECT 8, 159, 'AAA', 20 FROM dual UNION ALL SELECT 9, 159, 'AAA', 1 FROM dual UNION ALL SELECT 10, 159, 'AAA', 2 FROM dual UNION ALL SELECT 11, 160, 'AAA', 3 FROM dual UNION ALL SELECT 12, 159, 'AAA', 1 FROM dual UNION ALL SELECT 13, 159, 'AAA', 2 FROM dual UNION ALL SELECT 14, 161, 'AAA', 3 FROM dual ) SELECT dept , seq , SUM(val) val FROM (SELECT idx, id, dept, val , SUM(flag) OVER(PARTITION BY dept ORDER BY idx) seq FROM (SELECT idx, id, dept, val , CASE WHEN LAG(id) OVER(PARTITION BY dept ORDER BY idx) <= id THEN 0 ELSE 1 END flag FROM t ) ) GROUP BY dept, seq ORDER BY dept, seq ;