데이터베이스 개발자 질문과 답변 게시판
데이터베이스 개발/운영 관련 질문과 답변을 올리는 게시판입니다. 궁금하신 내용을 이곳에서 문의하시면 SQLER 분들의 답변을 받으실 수 있습니다. 문의를 하실때에는 최근 작업하신 특이 사항이나, 장애 발생 전 상황을 상세히 올려 주시면 답글을 적어주시는 SQLER분들의 답변이 더 정확할 수 있으니 도움 되시길 바랍니다. 쿼리 문의일 경우, 실제 문제가 재현되는 테이블생성, 샘플데이터 생성 쿼리를 함께 올려 주시면 더 빠르고 정확한 쿼리 문의 응답이 가능합니다.
Idx | 주문번호 | 포인트 | 잔여포인트 |
1 | A | 1000 | 0 |
2 | B | 1000 | 400 |
3 | C | 1500 | 1500 |
4 | D | 1000 | 1000 |
5 | E | 1000 | 1000 |
6 | F | 1000 | 1000 |
7 | G | 1000 | 1000 |
안녕하세요. 고민좀 하다 질문드립니다.
위 테이블은 선입선출 테이블이구요 (먼저 들어온포인트 먼저 사용)
커서를 사용하지 않고
예를들면
회원이 3500포인트를 사용하려 한다면
IDX 기준
2 - 400
3 - 1500
4 - 1000
5 - 600
원을 사용하게 됩니다.
사용하려는 3500원이 되는 idx값을 구해오고 싶습니다.
후처리는 idx 5 보다 작은건 잔여포이트 0원 처리하고
idx 5를 600원 감소시켜 400원으로 남게하려구요..
커서사용하면 좀 지저분할꺼 같아 쿼리로 뽑아보고 싶습니다. 선입선출 테이블을 저렇게 구현해도 되는지 모르겠네요.
상세 테이블은 따로있습니다.
Comment 5
-
폭주
2013.10.24 09:46
이렇게 하시면 될듯한데 더 좋은 답변은 다음 분이 주실꺼에요.DECLARE @사용포인트 INTSELECT @사용포인트=3500;WITH CTE_TEST(Idx,주문번호,포인트,잔여포인트)AS(SELECT 1,'A',1000,0UNION ALLSELECT 2,'B',1000,400UNION ALLSELECT 3,'C',1500,1500UNION ALLSELECT 4,'D',1000,1000UNION ALLSELECT 5,'E',1000,1000UNION ALLSELECT 6,'F',1000,1000UNION ALLSELECT 7,'G',1000,1000)SELECT A.Idx ,A.주문번호 ,A.포인트 ,A.잔여포인트 ,CASE WHEN SUM(B.잔여포인트)-@사용포인트<0 THEN A.잔여포인트 ELSE A.잔여포인트-(SUM(B.잔여포인트)-@사용포인트) END AS 포인트사용FROM CTE_TEST ALEFT OUTER JOIN CTE_TEST BON A.Idx >= B.IdxWHERE A.잔여포인트>0GROUP BY A.Idx ,A.주문번호 ,A.포인트 ,A.잔여포인트HAVING A.잔여포인트-SUM(B.잔여포인트)>@사용포인트*(-1); -
이시우_301202
2013.10.24 09:49
wOW~ 정말 감사드립니다. 엄청 도움됬습니다.
-
건우아빠
2013.10.24 09:51
누적 계산을 하신 다음
누적치 - 3500 이 0보다 큰건 들중 최소건을 찾으시고
최소건에는 누적치- 3500 한게 잔여 포인트가 되겠네요...
물론 0 보다 적은 값은 0으로 하시구요.
누적 계산은 누적으로 조회해보시면 ...
ㅎㅎㅎ 댓글 저장하고 보니 이미 다셨네.
-
이시우_301202
2013.10.24 09:58
넵 감사합니다. 찾아보겠습니다.
-
건우아빠
2013.10.24 10:00
폭주님이 다신게 누적계산방법입니다...
SUM(B.잔여포인트) [잔여누적치]