database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 41198 게시물 읽기
No. 41198
초보자입니다.(급하기도 하구요)
작성자
신무기(eksdnjsrn)
작성일
2016-07-19 10:04
조회수
7,881

완전 초보자입니다.

 

자재 수불부 관련내용(일 5만건 이상 수불이 발생되고 있는데,중간에 수불수량이 잘못되어

이전재고와 현재고를 UPDATE하고 싶습니다.)

 

품목 이전재고 수불수량 현재고 수불일자 수불시분초

 

A 1000 +100 1100 20160713 170101

A 1100 -50 1050 20160713 170102 --> (수불수량 변경 -70) 현재고 1030

A 1050 -60 990 20160713 170103 --> 이전재고 1030 현재고 970

B

B

C

C

.

.

 

UPDATE 쿼리문 부탁합니다.(가능하시면 oracle,db2)

 

이 글에 대한 댓글이 총 7건 있습니다.

UPDATE 테이블
   SET 이전재고 = 이전재고 + CASE WHEN 수불일자 = '20160713'
                                   AND 수불시분초 = '170102'
                                  THEN 0 ELSE -20 END
     , 수불수량 = 수불수량 + CASE WHEN 수불일자 = '20160713'
                                   AND 수불시분초 = '170102'
                                  THEN -20 ELSE 0 END
     , 현재고 = 현재고 - 20
 WHERE 품목 = 'A'
   AND ( (수불일자 = '20160713' AND 수불시분초 >= '170102')
      OR (수불일자 > '20160713') )
;

마농(manon94)님이 2016-07-19 10:43에 작성한 댓글입니다.
이 댓글은 2016-07-19 10:43에 마지막으로 수정되었습니다.

다시질문 드리겠습니다.제가 문의를 잘못드린것 같습니다.

(특정기간을 선택하고 전 품목에 대해서 특정ROW값(수불수량이)바뀌면

그 이하 동일품목은 모두 이전재고와 현재고가 바뀌어야 합니다

ORDER BY는 품목/일자/시분초입니다.)

예를들면 170102초에 출고수량이 50-->70으로 변경되면 현재고 1030

170103 이전재고 1030 현재고는 970

170104 이전재고 970 현재고 1050

모르긴 해도 배치프로그램이 되어야 할것 같습니다.

정말 초보자이고 막막하기에 마농님이 협조가 절대적으로 필요합니다.

 

품목 이전재고 수불수량 현재고 일자 시분초 비고

A 1,000 입고100 1,100 20160713 170101

A 1,100 출고50 1,050 20160713 170102 출고수량50-->70으로변경

A 1,050 출고60 990 20160713 170103

A 990 입고80 1,070 20160713 170104

B 80 입고250 330 20160713 170105

B 330 입고300 630 20160713 170106

B 630 출고300 330 20160713 170107 출고수량300-->250으로변경

B 330 출고150 180 20160713 170108

.

.

.

.

 

신무기(eksdnjsrn)님이 2016-07-19 11:23에 작성한 댓글입니다.

글쎄요?
문의사항에는 문제가 없었던것 같은데요?
질문에 대한 제 답변 내용도 적절한 듯 하구요?
제 답변 내용은
A 품목 중 20160713 170102 에 해당하는 수불수량을 -20 조정하면
해당 행 포함 이후 행의 모든 정보가 함께 변경되는 쿼리입니다.

마농(manon94)님이 2016-07-19 13:09에 작성한 댓글입니다.
이 댓글은 2016-07-19 13:10에 마지막으로 수정되었습니다.

진심어린 답변 감사합니다.

그런데 제가 말한 의도는 수불부(입,출고)수량이 변경되어

이전재고와 현재고가 틀어져 있어 바르게 자료를 만들기 위함이거든요

"현 이전재고는 바로 위 현재고 값을 가져와야 하고", 현재고= 이전재고+-수불수량UPDATE

주로 월말에 마감전 실행시키기위함입니다.(상기의 UPDATE문은 특정품목이 변경되면 수행되는 쿼리문 같은데요)

신무기(eksdnjsrn)님이 2016-07-19 15:09에 작성한 댓글입니다.

의도하시는 바와 질문하시는 바가 다른 듯 하네요.
변경 이야기를 계속 하셔서( 출고수량50-->70으로변경 )
변경되는 순간 처리하는 방법을 알려드렸는데요.


이미 변경(출고수량만 달랑 업데이트)이 완료된 자료를 바로 잡고 싶다는 건가요?


MERGE INTO 수불 a
USING
(
SELECT 품목
     , 수불일자
     , 수불시분초
     , 수불수량
     , FIRST_VALUE(이전재고) OVER(
       PARTITION BY 품목 ORDER BY 수불일자, 수불시분초) 이월재고
     , SUM(수불수량) OVER(
       PARTITION BY 품목 ORDER BY 수불일자, 수불시분초) 현월재고
  FROM 수불
 WHERE 수불일자 LIKE '201607%'
) b
ON ( a.품목 = b.품목
AND a.수불일자 = b.수불일자
AND a.수불시분초 = b.수불시분초
)
WHEN MATCHED THEN
  UPDATE
     SET a.이전재고 = b.이월재고 + b.현월재고 - b.수불수량
       , a.현재고   = b.이월재고 + b.현월재고
;

마농(manon94)님이 2016-07-19 15:46에 작성한 댓글입니다.

답변 진심으로 감사드립니다.

실은 DB2초심자인데 적용하여 실행시켜보았는데

FIRST_VALUE(이전재고)와 SUM(수불수량)부분에서 오류가 나네요.

그리고 A.이전재고는 이전ROW의 현재고를 가져와야 하는데...

아무튼 열심히 공부해서 해결책을 찾아보겠습니다.

신무기(eksdnjsrn)님이 2016-07-19 17:19에 작성한 댓글입니다.

DB2 는 분석함수가 없는 모양이네요.
어차피 월말 배치 작업이라면?
프로시져로 작성하시는게 좋을 듯 합니다.
대상 리스트 커서로 가져와서 루프 돌려가며
이전행의 재고를 변수에 담아 두고 다음행에서 사용하면 됩니다.

마농(manon94)님이 2016-07-19 17:27에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41201쿼리 문의 [1]
쿼리OTL
2016-07-27
6610
41200스키마 확인 [1]
봉달이2
2016-07-22
6757
41199기준일에서 일정한 간격으로 조회하려고 합니다. [2]
선이
2016-07-21
6887
41198초보자입니다.(급하기도 하구요) [7]
신무기
2016-07-19
7881
41197오라클 쿼리문 SQL SERVER로 바꾸려면?? [2]
헤매이다
2016-07-18
7072
41196ㅂㅈㄷㅂㅈ [1]
강컴공
2016-07-12
6967
4119511g se 에 em 설치가 가능한가요?
남영민
2016-07-07
6982
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.049초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다