[mssql]누적 연산 관련 질문입니다 ㅠㅠ 0 18 8,952

by 밍밍∨ [SQLServer] [2013.11.20 10:35:27]


DBMS 는 mssql 2008 입니다
- 해보니깐 sum over() 에  order by 안먹네요 ㅠㅠ

아래와 같은 데이터를 조작 하여 원하는 값을 뽑고 싶은데..
어떻게 하면 좋을지 잘 모르겠습니다!!

dense_rank 를 이용하여 각 구분의 첫번째 row는 rcv_qty - qty 하면 되는데..
그 이후부터는.. 그 값들의 누적에 연산을 해야 하는데 해당 값을 누적연산 하려면
어떻게 해야 하는지 감이 잘 안오네요..ㅠㅠ


 구분   qty     amt rcv_qty rcv_amt rcvqty누계   rcvamt누계  원하는 값
K 8432 4281.7 657 394.2 8432 4281.7 -7775
K 8432 4281.7 7775 3887.5 8432 4281.7 0
D 7758 16291.8 7758 16291.8 7758 16291.8 0
F 7681 2688.35 0 0 7037.9 2483.63 -7681
F 7681 2688.35 219.6 70.86 7037.9 2483.63 -7461.4
F 7681 2688.35 6509 2300.94 7037.9 2483.63 -952.4
F 7681 2688.35 309.3 111.83 7037.9 2483.63 -643.1

by 용근님 [2013.11.20 10:39:20]

sum() over()

by 우리집아찌 [2013.11.20 11:07:52]
-- ms-sql 이시죠..
-- seq 는 정렬순서
-- 분석함수도 ANSI 표준이라서 가능할겁니다. 2005이상
SUM( rcv_qty - qty ) OVER(ORDER BY seq )

by 홍상표 [2013.11.20 11:36:59]
dense_rank를 이용해서 d_rank 컬럼이 있다는 가정하에..  다음과 같네용..

with t as (
select 'K' gubun,     8432 qty,      657        rcv_qty, 1 d_rank from dual union all
select 'K' gubun,     8432 qty,     7775    rcv_qty, 2 d_rank from dual union all
select 'D' gubun,     7758 qty,     7758    rcv_qty, 1 d_rank from dual union all
select 'F' gubun,     7681 qty,     0        rcv_qty, 1 d_rank from dual union all
select 'F' gubun,     7681 qty,     219.6    rcv_qty, 2 d_rank from dual union all
select 'F' gubun,     7681 qty,     6509    rcv_qty, 3 d_rank from dual union all
select 'F' gubun,     7681 qty,     309.3    rcv_qty, 4 d_rank from dual 
)
select gubun
        , qty
        , rcv_qty
        , sum(kkk) over ( partition by gubun order by d_rank ) aaa
from (        
select gubun
       , qty
       , rcv_qty
       , case when d_rank=1 then rcv_qty-qty else rcv_qty end kkk
       , d_rank
from t
)
order by gubun, d_rank

by 밍밍∨ [2013.11.20 11:58:27]

오.. sum over 라는게 있군요ㅠ 한번 해보겠습ㄴㅣ다!! 감사합니다 ^^

by 마농 [2013.11.20 12:50:27]
밍밍~
DBMS 를 명시해서 질문해야쥐~
ms-sql 이라면 sum() over()에 order by 안먹을 걸?
아 그리고 테이블 데이터의 정렬기준이 안보이네?
이런 류의 문제엔 반드시 정렬기준이 있어야 해~

by 밍밍∨ [2013.11.20 13:10:23]

헉 ㅠㅠ 그러네요.. sum over 에 order by 안됨 

mssql 이예요
정렬기준은 구분이구요.

각 구분값별로 연산.. 이예요


by 마농 [2013.11.20 13:15:40]
구분 말고 유니크한 정렬 기준 필요함.

by 밍밍∨ [2013.11.20 13:25:34]

그게 문제예요 ㅠㅠ
이게 각 구분의 rcv_qty - qty를 하는건 맞는데요.
각 구분이 끝날때 쯤에 sum(rcv_qty) 가 qty와 같으면 0이 되야 되는거라서요..ㅠ
첫번째 row만  rcv_qty - qty 이렇게 하는게 맞고 그 다음 row 부터는  rcv_qty - qty 의 누계 값에서
누계값 - rcv_qty를 해야 되거든요..
그래서 dense_rank 를 넣어서 이것저것 해봤는데..

이게 지금 제가 되는지 안되는지 조차.. 감이 잘 안와요..
엑셀로 컬럼을 더해보고 빼보고 데이터 예상되는 값을 
출력해 보고  별짓 다하는데 모르겠어요 ㅠㅠ


num 구분 qty amt rcv_qty rcv_amt rcvqty누계 rcvamt누계 rcv_qty - qty
1 K 8432 4281.7 657 394.2 8432 4281.7 -7775
2 K 8432 4281.7 7775 3887.5 8432 4281.7 0
1 D 7758 16291.8 7758 16291.8 7758 16291.8 0
1 F 7681 2688.35 0 0 7037.9 2483.63 -7681
2 F 7681 2688.35 219.6 70.86 7037.9 2483.63 -7461.4
3 F 7681 2688.35 6509 2300.94 7037.9 2483.63 -952.4
4 F 7681 2688.35 309.3 111.83 7037.9 2483.63 -643.1


by 밍밍∨ [2013.11.20 13:44:31]

아님 유니크하게 꼭 하려면
구분을 찢어서 union 하면 될랑가요 ㄷㄷㄷ 다시 시도 하고 있긴한데;;

(구분 k)
union
(구분 d)
union
(구분 f)


by 용근님 [2013.11.20 13:28:54]
오 어떻게 ms-sql이라는걸 다들 아셨지?

by 우리집아찌 [2013.11.20 13:33:13]

밍밍님 스토커들이에요.. ㅎㅎㅎㅎㅎ


by 밍밍∨ [2013.11.20 13:37:12]

죄송해요 ㅋㅋ
제가 DBMS 를 안알리는  상습범 인지라;; ㅠㅠ


by 마농 [2013.11.20 14:00:51]
그게 아니고 정렬기준 컬럼이 필요해..
구분만으로 정렬한다면 657 이 먼저 나올지 7775가 먼저 나올지 알수가 없지.
구분 안에서도 레코드를 유일하게 식별할수 있는 정렬기준이 필요한거야.

by 밍밍∨ [2013.11.20 14:31:37]
dense_rank 로 구분별로 num 값을 넣어서 순번을 정해준건데
그거로는 안되는거예요?? ;;;

by 마농 [2013.11.20 14:55:54]

num 이라는 정렬기준이 있는 거구만?
그런데 dense_rank 는 왜? row_number 이 아니고?


by 마농 [2013.11.20 15:01:21]
WITH t(구분, num, qty, rcv_qty)
AS (      SELECT 'K', 1, 8432,  657.0
UNION ALL SELECT 'K', 2, 8432, 7775.0
UNION ALL SELECT 'D', 1, 7758, 7758.0
UNION ALL SELECT 'F', 1, 7681,    0.0
UNION ALL SELECT 'F', 2, 7681,  219.6
UNION ALL SELECT 'F', 3, 7681, 6509.0
UNION ALL SELECT 'F', 4, 7681,  309.3
)
SELECT a.구분, a.num, a.qty, a.rcv_qty
     , SUM(b.rcv_qty) - a.qty AS 원하는값
  FROM t a
 INNER JOIN t b
    ON a.구분 = b.구분
   AND a.num >= b.num
 GROUP BY a.구분, a.num, a.qty, a.rcv_qty
 ORDER BY a.구분, a.num
;

by 밍밍∨ [2013.11.20 16:08:32]

우잉! 싱기하군요..ㅠ
근데.. 그 테이블을 2개로 뿔려서 하는거죠?

num>= num 요거는 잘 이해가 안되요@@


by 밍밍∨ [2013.11.20 16:49:33]

참고하여 변경 해서 원하는 값이 나왔어요 ㅠㅠ
아 정말 감사드려요 ㅠㅠ

어제부터 했는데 안되서 ㅠㅠㅠ
너무 괴로웠는데 ㅠ 결과를 보니 눙무리..ㅠㅠㅠ
감사합니다!!

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