고수님들의 도움을 받고자 합니다. 1 2 464

by InsideCore [SQL Query] [2021.04.15 06:41:48]


아래와 같이 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

 위와 같이 가능할까요?

고수님들 도와 주십시오.

by 마농 [2021.04.15 08:23:02]

우선 해당 요구사항을 만족하기 위한 전제조건으로
일련번호나 날짜 등과 같은 정렬용 필드가 추가로 표현되어야만 합니다.
그리고, 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
;

 


by InsideCore [2021.04.20 13:56:37]

마농님 감사 합니다.

추후 질문에는 받드시 db 종류도 명시하도록 하겠습니다.

다시한번 더 감사 드립니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입