아래와 같이 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
;
마농님 감사 합니다.
추후 질문에는 받드시 db 종류도 명시하도록 하겠습니다.
다시한번 더 감사 드립니다.