쿼리 구분별 조건 조언좀 도와주세요ㅜ마농님 부탁드립니다. 0 10 827

by 아이린 [SQL Query] [2018.12.18 09:35:20]


출고구분 위치
(출고구분 A,B는 1만포함 C는 2만 포함)
수출국가
(출고구분 별 포함A,C(내수), B(수출))
고산지대여부
(출고구분A,C만사용 포함일수 있고 아닐수도 있음)
A 1 410-한국(내수) Y
B 1 156-중국(수출) N
C 2 410-한국(내수) N
A 1 410-한국(내수) N
B 1 156-중국(수출) N
C 2 410-한국(내수) Y

- 해당 데이터는 출고 구분별로 조건이 틀린 제품의 가용재고 데이터를 조회하기 위함입니다.

1 - A.출고구분은 위치1인 곳에서만 출고하며, 국가(내수)인거만, 고산지대여부는 둘중하나 가능 Y&N이 포함인 가용제품 조건

2 - B.출고구분은 위치1인 곳에서만 출고하며, 국가(수출)인거만, 고산지대여부는 아닌거만 N이 포함인 가용제품 조건 

3 - C.출고구분은 위치2인 곳에서만 출고하며, 국가(내수)인거만, 고산지대여부는 둘중하나 가능 Y&N이 포함인 가용제품 조건

 

출고구분별 조건에 의한 출고나갈제품의 데이터를  제품의 (위치, 수출국가, 고산지대여부)의 재고 데이터를 가용 할수있는 수량을 위에 조건에 맞게 조회후 가용체크를 할려고 합니다.

1.2를 같이해서 조회하고 3을 따로 조회해서 unionall해서 조건을 어떻게 할지가 몇일을 해봤는데 잘 안되네요.   

도움 부탁드려요 감사합니다.

 

by 랑에1 [2018.12.18 10:42:23]

고산지대여부는 규칙이 없어보이는데요?


by 아이린 [2018.12.18 11:24:19]

답글 감사합사합니다,  고산지대는 출고 구분이 A, C만 Y가 포함 될수 있구요 B는 무조건 N거지만 A,C도 N일수도 있는 규칙이 있긴 합니다.


by 마농 [2018.12.19 08:57:29]
SELECT *
  FROM t
 WHERE 1=1
   AND NOT ( 출고구분 = 'A' AND 위치 = '1' AND INSTR(수출국가, '(내수)') > 0 )
   AND NOT ( 출고구분 = 'B' AND 위치 = '1' AND INSTR(수출국가, '(수출)') > 0 AND 고산지대여부 = 'N')
   AND NOT ( 출고구분 = 'C' AND 위치 = '2' AND INSTR(수출국가, '(내수)') > 0 )
;

 


by 아이린 [2018.12.19 12:45:04]

마농님 답변 정말 감사합니다.
질문 하나만 할게요, 출고 구분별로 저렇게 조건을 하면  조건에 의해서 아예 안나오는 것이 있기때문에 구분의 조건별 unionall을 해서 전체 다나오게 해야 하지 않는가해서요? 제가 이해를 잘 못한건지 마농님이 해주신건 구분별 조건에 만족 안되면 빠지는게 아닌가요? 설명이 좀 부족했던거 같습니다.

하고자하는건 출고전표(출고구분별) 제품들이 여러건이 있는데 그 출고구분별 재고의제품이 조건인 위치, 국가, 고산지대 여부가 조건에 만족하는걸 출고전표 구분에 맞게 가용할수 있는 제품이 몇개가 있어서 가용할수 있는지를 체크해야 하는겁니다. 해주신 조건만 걸면  조건에 해당하면 한쿼리면 안나오기에 출고 구분별 다나올려면 한쿼리에서는 안될까요?

 


by 마농 [2018.12.20 08:31:39]

글로 아무리 잘 설명해 봤자.
눈으로 한번 보는 것만 못합니다.
원하시는 결과를 표 형태로 보여주세요.
 

SELECT t.*
     , CASE WHEN 출고구분 = 'A' AND 위치 = '1' AND INSTR(수출국가, '(내수)') > 0 THEN 1
            WHEN 출고구분 = 'B' AND 위치 = '1' AND INSTR(수출국가, '(수출)') > 0 AND 고산지대여부 = 'N' THEN 1
            WHEN 출고구분 = 'C' AND 위치 = '2' AND INSTR(수출국가, '(내수)') > 0 THEN 1
       ELSE 0 END AS 가용여부
  FROM t
;

 


by 아이린 [2018.12.20 11:27:19]

네 마농님 감사합니다. 결과 표다시 해봤습니다. 다시한번 확인 부탁드립니다.

 

주문수량

출고구분 제품 국가코드 고산지대여부 수량 가용 비고
11 A 410 Y 200 N (100-200) = -100 수량부족
B 410 N 300 N 조건에 일치하는 제품 없음
재고수량 없음
C 410 Y 100 Y 재고수량 있음
12 A 410 Y 100 Y 재고수량 있음
B 410 N 100 Y 재고수량 있음
C 410 N 100 N 조건에 일치하는 제품 없음
재고수량 없음
13 A 156 N 100 Y 재고수량 있음
B 160 N 100 Y 재고수량 있음
C 156 N 500 N (100-500) = -400 재고수량 부족

 

재고수량

제품 위치 국가코드 고산지대여부 수량
A 1 410 Y 100
A 2 160 N 200
A 1 156 N 100
A 1 410 N 300
A 2 410 Y 100
B 2 160 N 100
B 1 410 Y 100
B 1 156 N 100
B 2 410 N 500
B 1 160 N 200
C 1 160 N 100
C 2 410 Y 100
C 1 160 N 100
C 1 156 N 100

 

410: 한국, 156: 중국, 160: 인도

 위에 주문이 재고수량을 조회해서 가용여부를 체크 할려고 합니다. 


by 마농 [2018.12.20 12:53:21]

위 예시 대비 결과에 대한 설명이 없네요?
테이블이 두개이고 (주문수량, 재고수량)
주문수량 을 기준으로 재고수량을 파악하여 가용여부를 표시하는 건가요?
원본 대비 결과에 대한 설명을 해주세요.
원본 대비 결과가 올바른지 검증해 주세요.


by 아이린 [2018.12.20 13:15:04]

네 맞습니다, 위에 테이블은 마농님이 말씀하시듯히 첫번째 테블과 2번째 값을 조인후

해당 1번째 주문테이블의 출고 구분별, 제품, 국가코드, 고산지대여부의 조건이 2번째 재고테이블의 수량이 출고구분별 제품의 전체 가용재고수량의 부족 여부에 대해서 체크 하는 부분입니다.

위치 조건은 출고구분: 11, 13은 위치1에 있는 제품만 가용할수 있으며 , 출고구분 12는 위치2만 가능합니다.

결과값은

아래표 의 결과값이며 가용 컬럼의 여부를 알려고 하는 겁니다.

출고구분 제품 국가코드 고산지대여부 수량 가용 비고
11 A 410 Y 200 N (100-200) = -100 수량부족
B 410 N 300 N 조건에 일치하는 제품 없음
재고수량 없음
C 410 Y 100 Y 재고수량 있음
12 A 410 Y 100 Y 재고수량 있음
B 410 N 100 Y 재고수량 있음
C 410 N 100 N 조건에 일치하는 제품 없음
재고수량 없음
13 A 156 N 100 Y 재고수량 있음
B 160 N 100 Y 재고수량 있음
C 156 N 500 N (100-500) = -400 재고수량 부족

by 마농 [2018.12.20 13:27:00]

설명하신 조건과 결과표가 일치하지 않네요? 결과를 한줄 한줄 꼼꼼히 살펴봐 주세요.
11, C, 410, Y 의 경우에 만족하는 재고가 없는 걸로 보입니다.

WITH 재고수량 AS
(
SELECT 'A' 제품, 1 위치, 410 국가코드, 'Y' 고산지대여부, 100 수량 FROM dual
UNION ALL SELECT 'A', 2, 160, 'N', 200 FROM dual
UNION ALL SELECT 'A', 1, 156, 'N', 100 FROM dual
UNION ALL SELECT 'A', 1, 410, 'N', 300 FROM dual
UNION ALL SELECT 'A', 2, 410, 'Y', 100 FROM dual
UNION ALL SELECT 'B', 2, 160, 'N', 100 FROM dual
UNION ALL SELECT 'B', 1, 410, 'Y', 100 FROM dual
UNION ALL SELECT 'B', 1, 156, 'N', 100 FROM dual
UNION ALL SELECT 'B', 2, 410, 'N', 500 FROM dual
UNION ALL SELECT 'B', 1, 160, 'N', 200 FROM dual
UNION ALL SELECT 'C', 1, 160, 'N', 100 FROM dual
UNION ALL SELECT 'C', 2, 410, 'Y', 100 FROM dual
UNION ALL SELECT 'C', 1, 160, 'N', 100 FROM dual
UNION ALL SELECT 'C', 1, 156, 'N', 100 FROM dual
)
, 주문수량 AS
(
SELECT 11 출고구분, 'A' 제품, 410 국가코드, 'Y' 고산지대여부, 200 수량 FROM dual
UNION ALL SELECT 11, 'B', 410, 'N', 300 FROM dual
UNION ALL SELECT 11, 'C', 410, 'Y', 100 FROM dual
UNION ALL SELECT 12, 'A', 410, 'Y', 100 FROM dual
UNION ALL SELECT 12, 'B', 410, 'N', 100 FROM dual
UNION ALL SELECT 12, 'C', 410, 'N', 100 FROM dual
UNION ALL SELECT 13, 'A', 156, 'N', 100 FROM dual
UNION ALL SELECT 13, 'B', 160, 'N', 100 FROM dual
UNION ALL SELECT 13, 'C', 156, 'N', 500 FROM dual
)
SELECT a.출고구분
     , a.제품
     , a.국가코드
     , a.고산지대여부
     , a.수량 AS 주문수량
     , b.수량 AS 재고수량
     , CASE WHEN b.수량 >= a.수량 THEN 'Y' ELSE 'N' END AS 가용
     , CASE WHEN b.수량 >= a.수량 THEN '재고수량 있음'
            WHEN b.수량 <  a.수량 THEN '재고수량 부족'
            WHEN b.수량 IS NULL   THEN '재고수량 없음'
        END 비고
  FROM 주문수량 a
  LEFT OUTER JOIN 재고수량 b
    ON b.제품         = a.제품
   AND b.위치         = DECODE(a.출고구분, 11, 1, 13, 1, 12, 2)
   AND b.국가코드     = a.국가코드
   AND b.고산지대여부 = a.고산지대여부
 ORDER BY 출고구분, 제품
;

 


by 아이린 [2018.12.20 13:46:37]

네  마농님 죄송합니다. 데이터를 꼼꼼히 못봤네요, 11, C, 410, Y 는 재고가 없는게 맞습니다.

쿼리는 정말 감사합니다.

 

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