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 40725 게시물 읽기
No. 40725
제조일자별 선입선출 쿼리문의
작성자
량디(fidele)
작성일
2015-02-27 15:41ⓒ
2015-02-28 13:47ⓜ
조회수
9,289

주문자료에 대해 제조일자별로 재고를 가져오는 쿼리 문의 드립니다..

누계를 구해와 case문을 사용해 보아도 잘 가져오질 못하네요...

쿼리로는 도저히 불가능한건지요... 프로시져로 looping 돌려야 하는 방법밖에는 없는건가요?

 

아래 설명 드리오니 고수님들 한수 부탁 드립니다

 

 

주문테이블

 

A제품 30

B제품 50

C제품 40

D제품 80

 

주문이 위와같이 들어왔을 경우 제품을 꺼내올때 제조일자별로 구성되어 있는 재고창고에서

제조일자별로 재고를 빼와야 합니다.

 

재고

 

생산일자 제품 재고수량

 

20150101 A제품 30

20150101 B제품 40

20150105 B제품 90

20150101 C제품 50

20150101 D제품 20

20150106 D제품 50

20150108 D제품 30

 

 

결과값

 

제품 주문수량 생산일자 출고 잔량

A제품 30 20150101 30 0

B제품 50 20150101 40 0

B제품 50 20150105 10 40

C제품 40 20150101 40 10

D제품 80 20150101 20 0

D제품 80 20150106 50 0

D제품 80 20150108 10 20

 

 

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

with 주문(제품,주문수량) as(
select 'A제품', 30 from dual union all
select 'B제품', 50 from dual union all
select 'C제품', 40 from dual union all
select 'D제품', 80 from dual
), 재고(생산일자,제품,재고수량) as(
select '20150101','A제품', 30 from dual union all
select '20150101','B제품', 40 from dual union all
select '20150105','B제품', 90 from dual union all
select '20150101','C제품', 50 from dual union all
select '20150101','D제품', 20 from dual union all
select '20150106','D제품', 50 from dual union all
select '20150108','D제품', 30 from dual union all
select '20150109','D제품', 30 from dual

select o.제품,o.주문수량,s.생산일자
     , case when sign(o.주문수량 - s.재고누적수량) >= 0 then s.재고수량 else s.재고수량 + o.주문수량 - s.재고누적수량 end 출고
     , greatest(s.재고누적수량 - o.주문수량, 0) 잔량
  from 주문 o ,(select 재고.*, sum(재고수량) over(partition by 제품 order by 생산일자) 재고누적수량 from 재고 ) s
 where o.제품 = s.제품
   and s.재고수량 + o.주문수량 - s.재고누적수량 > 0
 

#looping 처리방식은

 

select 제품,주문수량,생산일자,출고,잔량 from (
select * from 주문 o, 재고 s
 where o.제품 = s.제품
model partition by (o.제품 k)
dimension by (rownum rn)
measures ( o.제품, 생산일자, 주문수량, 재고수량, 0 재고누적수량, 0 출고, 0 잔량 )
RULES
(
      재고누적수량[any] = 재고수량[cv()] + nvl(재고누적수량[cv()-1],0)
    , 출고[any] = 재고수량[cv()] + 주문수량[cv()] -  재고누적수량[cv()]
    , 출고[any] = case when 출고[cv()] > 재고수량[cv()] then 재고수량[cv()] else 출고[cv()] end 
    , 잔량[any] = 재고누적수량[cv()] - 주문수량[cv()]
    , 잔량[any] = greatest(잔량[cv()],0))
)      
where 출고 > 0
order by rn

이런식으로 응용하심...

최성준(junkk)님이 2015-03-02 12:22에 작성한 댓글입니다.
이 댓글은 2015-03-02 13:36에 마지막으로 수정되었습니다.

안쓰던 함수들이 많이 보이네요...

 

최성준님 답변 감사합니다..

 

응용해서 한번 해보겠습니다.

량디(fidele)님이 2015-03-02 13:20에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40729체크쿼리 어떻게 만들어야 할까요? [1]
궁금맨
2015-03-05
7210
40728oracle 분석함수 질문입니다. [12]
트랄랄라
2015-03-04
9764
40727정해진 수대로 레코드 분할 [1]
시로73
2015-03-02
6951
40725제조일자별 선입선출 쿼리문의 [2]
량디
2015-02-27
9289
40724[질문] 연속된 순차자료 우측으로 표현 [1]
안동석
2015-02-26
7062
40723중간에 끼워넣기 다시 문의 드립니다. [3]
김태경
2015-02-25
8605
40720오라클 ORA-28232, ORA-06512 오류문제 (cryptit) [1]
최진호
2015-02-20
9666
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다