누계 계산 쿼리 문제인데요. 0 8 1,558

by 이카루스 [SQLServer] [2014.03.10 13:06:52]


  안녕하세요..
   
gid 그룹에 따라 누계 계산하는데요.  

gid 그룹마다 누계하는것 보단  
gid 의 1 일때 총합계 구하고 
gid 의 2 일때 총합계 + gid의 1 총갯수합계 구하고
gid 의 3 일때 총합계 + gid의 1 총합계+ gid의 2 총합계  구하는 누계과정입니다. 


아래 이미지 보시면

샘플

전(샘플) 후 (결과)
num gid amt tot_amt num gid amt tot_amt
1 1 10 - 1 1 10 30
2 1 10 - 2 1 10 30
3 1 10 - 3 1 10 30
4 2 10 - 4 2 10 50
5 2 5 - 5 2 5 50
6 2 5 - 6 2 5 50
7 3 10 - 7 3 10 75
8 3 10 - 8 3 10 75
9 3 5 - 9 3 5 75
10 4 5 - 10 4 5 90
11 4 5 - 11 4 5 90
12 4 5 - 12 4 5 90
13 5 10 - 13 5 10 110
14 5 10 - 14 5 10 110





이렇게 표현하고 싶은데요 쿼리상으로 할려고하니 답이 안 나오네요.
게시판에 누계라는 검색해서 찾아보았으나.... ㅠ_ㅠ.. 대부분 그룹마다 합계구하는것밖 에없네요
by DarkBee [2014.03.10 13:19:28]
SELECT t.*
     , SUM ( DECODE ( rn, 1, sum_ ) ) OVER ( ORDER BY gid )
  FROM (
          SELECT t.*
               , SUM ( amt ) OVER ( PARTITION BY gid ) sum_
               , ROW_NUMBER () OVER ( PARTITION BY gid ORDER BY num ) rn
            FROM t
) t

by 이카루스 [2014.03.10 13:46:29]
mssql 기준으로 짜봤는데요.

 SELECT t.* 
, SUM ( case when  t.rn = 1 then  t.sum_  end ) OVER ( ORDER BY t.gid ) 
  FROM ( 
  SELECT t.* 
   , SUM ( amt ) OVER ( PARTITION BY gid ) sum_ 
   , ROW_NUMBER () OVER ( PARTITION BY gid ORDER BY num ) rn 
    FROM t
) t

하니까 에러 나네요. ㅠ_ㅠ.

order 근처의 구문이 잘못되었습니다 라고 나오는데요..음.. t 근처의 구문이라면..음..

by 마농 [2014.03.10 13:54:31]
SELECT num, gid, amt
     , SUM(amt) OVER(ORDER BY gid) tot_amt
  FROM t
;

by 마농 [2014.03.10 14:01:08]
오라클용입니다.
mssql 의 sum over 구문에서는 order by 가 안먹습니다.

by 이카루스 [2014.03.10 14:03:23]
아...그렇군요..ㅠ_ㅠ..음..

by 마농 [2014.03.10 14:07:19]
-- MSSQL : Self Join 이용
SELECT a.num, a.gid, a.amt
     , SUM(b.amt) tot_amt
  FROM t a
 INNER JOIN t b
    ON a.gid >= b.gid
 GROUP BY a.num, a.gid, a.amt
 ORDER BY gid, num
;

by 이카루스 [2014.03.10 14:29:44]
아 셀프 조인을 이용하는 방법이네요.
셀프조인 쿼리보니 새롭게 보네요 ㅠ_ㅠ
근데요  a.gid >= b.gid  이건 왜 쓰는지 궁금하네요. 설명을 부탁드립니다.
그리고 방법으로 재작업해보니까  잘 풀리네요..정말 감사합니다.  ^^

by 임상준 [2014.03.10 15:32:28]

a.gid >.... 이건 그룹 바이 없에고 셀프 조인한 데이터끼리 양쪽 비교 해 보시면 눈에 들어오실 것 같습니다...

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