안녕하세요. 계속 눈팅만하다가 급하게 질문 올립니다.
특정 column의 값을 기준으로 그룹단위로 다른 column의 합을 구해야 하는데요...
테이블 구조는 아래와 같이 생겼습니다.
ID | ColA | ColB | ColC | ColD |
1 | 0 | 1 | ||
23 | 0 | 2 | ||
33 | 1 | 1 | ||
34 | 4 | 3 | ||
35 | 5 | 3 | ||
36 | 0 | 2 | ||
40 | 0 | 3 | ||
41 | 0 | 5 | ||
50 | 1 | 3 | ||
55 | 1 | 3 | ||
60 | 0 | 3 | ||
61 | 0 | 3 | ||
66 | 0 | 1 | ||
67 | 1 | 3 |
대충 이렇게 생긴 테이블입니다. (ColC,ColD는 중요하지 않습니다.)
여기서, ColA의 값이 0인 row의 부분합을 min ID를 기준으로 구해야 합니다.
즉, 아래와 같이 나와야 합니다.
ID | ColA | SUM |
1 | 0 | 3 |
36 | 0 | 5 |
60 | 0 | 7 |
예를들어, ID36은 ID가 36,40,41 (연속으로 0인 그룹)의 ColB의 전체 합입니다.
이걸 group by로도 아닌거 같고, pivot도 아닌 것 같아서 좀 난감합니다.
정 안되면 cursor를 가지고 건별로 앞뒤비교하면서 돌려야 하는데, 레코드수가 만만찮아서 고민하는 중입니다.
cursor말고 다른 방안이 없을까요? 중간 테이블에 저장해도 상관없습니다.
Comment 1
-
지영아빠
2023.07.06 12:30
결과의 에서 ID 36d은 10이 되어야 할 것 같습니다.
참고요...
with tmp as (
SELECT 1 as ID, 0 as ColA, 1 as ColB union all
SELECT 23 as ID, 0 as ColA, 2 as ColB union all
SELECT 33 as ID, 1 as ColA, 1 as ColB union all
SELECT 34 as ID, 4 as ColA, 3 as ColB union all
SELECT 35 as ID, 5 as ColA, 3 as ColB union all
SELECT 36 as ID, 0 as ColA, 2 as ColB union all
SELECT 40 as ID, 0 as ColA, 3 as ColB union all
SELECT 41 as ID, 0 as ColA, 5 as ColB union all
SELECT 50 as ID, 1 as ColA, 3 as ColB union all
SELECT 55 as ID, 1 as ColA, 3 as ColB union all
SELECT 60 as ID, 0 as ColA, 3 as ColB union all
SELECT 61 as ID, 0 as ColA, 3 as ColB union all
SELECT 66 as ID, 0 as ColA, 1 as ColB union all
SELECT 67 as ID, 1 as ColA, 3 as ColB
)
select
Min(ID) as ID,
SUM(colB) as colB_Sum
from TMP A
cross apply (
select
MAX(ID) as MID
FROM (
select
ID,
ColA,
ColB,
case when lead(ColA) over (order by id) = 0 then ID else NULL end a,
case when Lag(ColA) over (order by id) = 0 then ID else NULL end b
from tmp
) x
where a is not null
and b is null
and colA = 0
and id <= A.ID
) B
where A.ColA = 0
group by B.MID