계산식을 만들었는데 좀이상해요 ㅠㅠ 0 9 1,658

by 지메이비 [SQL Query] MSSQL [2022.07.07 13:39:58]



declare @N_preStockQty numeric(13,2)

   --이전달을 구한다.
   declare @C_PreMonth varchar(6)
   set @C_PreMonth=''
   
   select @C_PreMonth=convert(varchar(6),dateadd(MONTH,-1,@A_CurrentDay),112)

   --이전달의 기말 재고를 구한다.
   declare @C_lastQty numeric(13,2)
   set @C_lastQty=0

   select @C_lastQty=isNull(stockQty,0)+isNull(upQty,0)-isNull(lossQty,0)
   from stockMonth with(NOLOCK)
   where dealerCode=@A_DealerCode
   and stockMonth=@C_PreMonth
   and materialCode=@A_MaterialCode

   --당월의 시작일을 구한다.
   declare @C_StartDay varchar(8)
   set @C_StartDay=''
   
   select @C_StartDay=substring(@A_CurrentDay,1,6)+'01'

   --출고수량
   declare @C_outQty numeric(13,2)
   set @C_outQty=0

   select @C_outQty=sum(materialqty-rtnQty) from orders with(NOLOCK)
   where dealerCode=@A_DealerCode
   and isWareHouse='W'
   and storeCode<>'9999'
   and materialCode=@A_MaterialCode
   and stockinDay between @C_StartDay and @A_CurrentDay
   group by materialCode

   --입고수량
   declare @C_inQty numeric(13,2)
   set @C_inQty=0

   select @C_inQty=sum(materialqty-rtnQty) from orders with(NOLOCK)
   where dealerCode=@A_DealerCode
   and materialCode=@A_MaterialCode
   and stockinDay between @C_StartDay and @A_CurrentDay
   and isWareHouse='W'
   and storeCode='9999'
   group by materialCode


 --로스수량
   declare @C_lossQty numeric(13,2)
   set @C_lossQty=0

   select @C_lossQty=(sum(upQty)-sum(lossQty)) from stockDay_LossUp with(NOLOCK)
   where dealerCode=@A_DealerCode
   and materialCode=@A_MaterialCode
   and stockDay between @C_StartDay and @A_CurrentDay

   select @N_preStockQty=isNull(@C_lastQty,0)+isNull(@C_inQty,0)-isNull(@C_outQty,0)+isNull(@C_lossQty,0)
   
   
   -- @C_lastQty : 전월 재고  5
   -- @C_inQty   : 해당 월 초부터 입고일자까지 입고 수량  0
   -- @C_outQty  : 출고수량(창고출고로 발주한 수량)  3
   -- @C_lossQty : 로스수량(upQty - lossQty)  -3 

   Return isNull(@N_preStockQty,0)
END

스칼라함수를 만들어서 stockQty를 반환하는데

같은날에 upQty와 lossQty가 들어오면 각각 계산을 안하고 한꺼번에 계산을 해버립니다..

-124.00 에서 lossQty가 3.00이 들어왔으니 -127.00이 되어야하는데 같은날에서 upQty인 10.00이 들어와서 -117.00으로 결과를

나타내버립니다..

by 마농 [2022.07.07 14:02:54]

날짜가 같으니 당연한 현상인데...
- 시간을 포함하여 비교하는 방안이 있습니다.(단 시간까지 중복은 못잡죠.)
- 시간이 따로 없다면 키 컬럼 같은 걸 포함하여 비교해야 합니다.
- 복잡하게 함수로 구현하지 말고 분석함수 등을 이용해 One-SQL 로 구할 수도 있습니다.


by 지메이비 [2022.07.07 14:19:05]

stockinday에 시간을 나타내는 함수를 쓰시라는말씀이신건가요??

아니면 따로 시간 컬럼을 추가하라는 말씀이신가요?? 


by 마농 [2022.07.07 14:33:29]

시간정보가 함께 관리되고 있다면? 그걸 이용하라는 것입니다.
- 시간까지 중복되는 일은 없다고 가정했을 때.


by 지메이비 [2022.07.07 15:07:10]

시간정보는 따로없어서 ... 키 컬럼밖에 방법이없는거같네요ㅠ


by 마농 [2022.07.07 15:29:27]

순서를 알 수 있는지?
-3 이 먼저인지? +10 이 먼저인지 순서를 알 수 있나요?
키 컬럼이 작은게 우선이라고 가정하면
 

SELECT ...
  FROM ...
 WHERE ...
   AND stockDay BETWEEN @C_StartDay AND @A_CurrentDay
   AND (  (stockDay < @A_CurrentDay)
       OR (stockDay = @A_CurrentDay AND pk <= @pk)
       )
;

 


by 지메이비 [2022.07.07 16:18:49]

-3이 먼저입니다.

근데 키값이 dealerCode, materialCode, stockinday인데 다 똑같아서 뭐로 구별해야할지 막막합니다


by 마농 [2022.07.07 16:59:05]

PK 맞나요? PK 는 중복이 되면 안됩니다.
그리고 -3 이 먼저라고 판단하는 근거가 있을 텐데요?
그 근거가 되는 정보를 이용하시면 됩니다.


by 지메이비 [2022.07.07 17:35:56]

아 제가 올린 코드는 한 로우의 stockQty 컬럼을 나타내기위한 함수코드입니다

그리고 -3 이나 +10 이나 안겹치기만 해도 되는데 이걸 따로 해야하는 방법을 모르겠습니다..

 


by 마농 [2022.07.08 08:00:34]

1. 아 제가 올린 코드는 한 로우의 stockQty 컬럼을 나타내기위한 함수코드입니다
-> 알고 있습니다.

2. 그리고 -3 이나 +10 이나 안겹치기만 해도 되는데 이걸 따로 해야하는 방법을 모르겠습니다..
-> 방법은 이미 알려드렸습니다. PK 를 이용해야 한다고.
-> PK 가 바로 행을 구별하는 역할을 하기 때문입니다.
-> 함수 이용 방법 외에 분석함수를 이용하는 방안도 제시했습니다.

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