MSSQL - 업무일지-1

이정민·2023년 1월 8일
0

원래 웹개발을 목표로 해서 성장중이었지만.. 어쩌다 보니 ERP개발 회사에 오게 되었고 MSSQL을 사용해서 업무를 진행하고 있다.

ERP회사의 특징상 구조적인 프로세스와 SQL이 업무의 주를 이루고 있기때문에 대부분 SQL을 사용하면서 시간을 보내고 있다.

그래서 이제부터 일주일에 1번 내가 사용했던 쿼리문들중 생각에 남았던걸 정리해서 올릴려고 한다.


AS건이었고
업체에서 원래는 입고, 출고 현재고 이렇게 3개만 보여주고 있는 컬럼에서

입고, 출고, 반납, 자재투입, 현재고5개로 보여주는 걸로 바꾸길 원했다.

처음하는 업체였기 때문에 프로시져를 뜯어봤고
이 일에 필요한 테이블 3개를 보게 되었다.
1. 수불일집계
2. 입고정보
3. 출고정보

수불일집계 테이블은 입고정보, 출고정보 테이블에 데이터가 들어올때마다 트리거로 저장되는 테이블이었고 이 테이블을 이용해서 원래있던 3개의 컬럼을 보여주고 있었다.


반납, 자재투입은 상태값으로 입고정보, 출고정보 테이블에 있었기 때문에 join을 해야되는 상황이었고 join을 하게되면 입고정보나 출고정보 중 1개만 보여주기 때문에 고민에 있었다.

그러던중 생각났던건 union all 이었다.


select a.itm_id, a.fac_cd, a.mng_no, a.mng2_no, a.wh_cd			-- 2023.01-04 작지. 이정민 추가  입고, 출고 2개 였던거 -> 4개로 만듬 (입고, 투입반납, 출고, 자재투입) 
	  ,a.in_qty
	  ,return_qty = a.in_qty2
	  ,a.out_qty
	  ,put_qty = a.out_qty2
	  ,a.in_dt
into #temp1
from(
select itm_id, fac_cd, mng_no, isnull(mng2_no,'') as mng2_no, wh_cd, in_dt , in_qty = case when in_bc <> 'le100400' then in_qty else 0 end,
									  in_qty2 = case when in_bc = 'le100400' then in_qty else 0 end,
									  out_qty = 0,
									  out_qty2 = 0
							   
from lea100

union all

select itm_id, fac_cd, mng_no, isnull(mng2_no,'') as mng2_no, wh_cd, out_dt, in_qty = 0,
									  in_qty2 = 0,
									  out_qty = case when out_bc <> 'LE200260' then out_qty else 0 end,
									  out_qty2 = case when out_bc = 'LE200260' then out_qty else 0 end
from leb100
) a

임시테이블로 만들어서 기존에 있던 테이블에 join을 걸어서 해결을 했다.


insert into #les101  
   (fac_cd, wh_cd, itm_id, mng_no,   
   bas_qty, in_qty, return_qty, out_qty, put_qty, end_qty)  
 select a.fac_cd, a.wh_cd, a.itm_id, a.mng_no,  
   sum(isnull(bas_qty,0)), sum(isnull(in_qty,0)), sum(isnull(return_qty,0)), sum(isnull(out_qty,0)), sum(isnull(put_qty,0)),   -- 2032.01-04 작지. 위에서 만든 임시테이블 적용
   sum(isnull(bas_qty,0) + isnull(in_qty,0) + isnull(return_qty,0) - isnull(out_qty,0) - isnull(put_qty,0))  
 from (  
      select a.fac_cd, a.wh_cd, a.itm_id,   
     case when @chk_lot = '1' then a.mng_no else '' end as mng_no,  
     bas_qty = sum(case when a.sum_dt < @fr_dt then  
           isnull(a.in_qty,0) - isnull(a.out_qty,0)  
         end ),  
     in_qty  = sum(case when @fr_dt <= a.sum_dt then  
           isnull(f.in_qty,0)  
         end),
	 return_qty = sum(case when @fr_dt <= a.sum_dt then
			isnull(f.return_qty,0)
		 end),
     out_qty = sum(case when @fr_dt <= a.sum_dt then  
           isnull(f.out_qty,0)  
         end),  
	 put_qty = sum(case when @fr_dt <= a.sum_dt then
		   isnull(f.put_qty,0)
		 end)
   from les100 a  --일자별   
     join dma100 b  on  a.itm_id = b.itm_id
	 join #temp1 f on f.itm_id = a.itm_id and f.fac_cd = a.fac_cd and f.mng_no = a.mng_no and f.wh_cd = a.wh_cd and f.mng2_no = a.mng2_no and f.in_dt = a.sum_dt -- 2032.01-04 작지. 위에서 만든 임시테이블 적용
     left join dma110 c on  a.itm_id = c.itm_id  
     join @wh_list w  on  a.wh_cd = w.wh_cd  
   where a.sum_dt between  @first_dt and @to_dt  
   and  (isnull(a.in_qty,0) <> 0 or isnull(a.out_qty,0) <> 0)

이후 데이터 검증 후에 이상이 없는걸 확인후 업체프로그램에 적용시켰다.

profile
안녕하세요.

0개의 댓글