본문 바로가기
DB/MSSQL (SQLSERVER)

[MSSQL] 누적값 구하기! (셀프조인!Self JOIN) 활용!

by 커져라불어라 2020. 8. 11.
반응형


안녕하세요! 오늘은 누적값을 구하는 쿼리에 대해 알아보려합니다. 누적값은 현업에서도 많이 사용되고, 보통 날짜를 기준으로 해당하는 누적값을 구하거나, 그냥 일반적으로 상품 판매 누적값을 구하기도 합니다. 그렇다면 누적값을 구하는 방법과 그 원리에 대해 설명해보겠습니다.


누적값은 현재 1행에서 시작해서 2행으로 넘어갈 때, 전 행의 값을 함께 가져와야 구할 수 있습니다. 그럼 이 논리에 따라서 시작점을 잡아보겠습니다.


(1) 1행의 값이 존재

(2) 2행으로 넘어감

(3) 2행에서는 1행의 값과 2행의 값을 동시에 가지고 있어야함

(4) 3행으로 넘어감

(5) 3행에서는 1행, 2행의 값과 3행의 값을 동시에 가지고 있어야함


이러한 로직대로 누적값을 구할 수 있습니다. 그렇다면 자기 자신의 값과 그 전행값을 가지고 있으려면 무엇이 필요할 까요? LAG함수를 써서 그 전행의 값을 가져온다? 이것도 괜찮은 방법같지만 더 쉬운 방법으로는 Self JOIN이 있습니다. 자기 자신끼리 JOIN을 걸어 한 테이블에서 로직을 작성하는 방법입니다.


WITH ACC AS (
SELECT 1 IDX, 100*1 VAL
UNION ALL SELECT 2 IDX, 200*2 VAL
UNION ALL SELECT 3 IDX, 300 * 3 VAL
UNION ALL SELECT 4 IDX, 400 * 4 VAL
)
SELECT A1.IDX
    , A1.VAL
    , SUM(A2.VAL) '누적값'
FROM ACC A1, ACC A2
WHERE 1=1
AND A1.IDX >= A2.IDX
GROUP BY A1.IDX, A1.VAL
ORDER BY 1,2
cs


WITH절은 현재 테이블이 없기 때문에 WITH으로 테이블을 만들고 밑에 SELECT ~ ORDER BY까지가 SELF JOIN을 통해 누적값을 구하는 방법입니다.

A1의 IDX와 A2의 IDX를 WHERE 조건으로 걸어줄 때, A1보다 작거나 같은 값을 걸어주게 되면 A1.IDX 1이면 A2.IDX 1 / A1.IDX 2이면 A2.IDX 1,2 / A1.IDX 3이면 A2.IDX 1,2,3 이 모두 포함되기 떄문에 SELECT절 SUM에는 A2의 VAL를 작성해 주어 A2.IDX의 1,2,3의 VAL값을 모두 알 수 있게 됩니다! 

반응형