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으로 결과를
나타내버립니다..
날짜가 같으니 당연한 현상인데...
- 시간을 포함하여 비교하는 방안이 있습니다.(단 시간까지 중복은 못잡죠.)
- 시간이 따로 없다면 키 컬럼 같은 걸 포함하여 비교해야 합니다.
- 복잡하게 함수로 구현하지 말고 분석함수 등을 이용해 One-SQL 로 구할 수도 있습니다.
시간정보가 함께 관리되고 있다면? 그걸 이용하라는 것입니다.
- 시간까지 중복되는 일은 없다고 가정했을 때.
stockinday에 시간을 나타내는 함수를 쓰시라는말씀이신건가요??
아니면 따로 시간 컬럼을 추가하라는 말씀이신가요??
시간정보는 따로없어서 ... 키 컬럼밖에 방법이없는거같네요ㅠ
순서를 알 수 있는지?
-3 이 먼저인지? +10 이 먼저인지 순서를 알 수 있나요?
키 컬럼이 작은게 우선이라고 가정하면
SELECT ...
FROM ...
WHERE ...
AND stockDay BETWEEN @C_StartDay AND @A_CurrentDay
AND ( (stockDay < @A_CurrentDay)
OR (stockDay = @A_CurrentDay AND pk <= @pk)
)
;
-3이 먼저입니다.
근데 키값이 dealerCode, materialCode, stockinday인데 다 똑같아서 뭐로 구별해야할지 막막합니다
PK 맞나요? PK 는 중복이 되면 안됩니다.
그리고 -3 이 먼저라고 판단하는 근거가 있을 텐데요?
그 근거가 되는 정보를 이용하시면 됩니다.
아 제가 올린 코드는 한 로우의 stockQty 컬럼을 나타내기위한 함수코드입니다
그리고 -3 이나 +10 이나 안겹치기만 해도 되는데 이걸 따로 해야하는 방법을 모르겠습니다..
1. 아 제가 올린 코드는 한 로우의 stockQty 컬럼을 나타내기위한 함수코드입니다
-> 알고 있습니다.
2. 그리고 -3 이나 +10 이나 안겹치기만 해도 되는데 이걸 따로 해야하는 방법을 모르겠습니다..
-> 방법은 이미 알려드렸습니다. PK 를 이용해야 한다고.
-> PK 가 바로 행을 구별하는 역할을 하기 때문입니다.
-> 함수 이용 방법 외에 분석함수를 이용하는 방안도 제시했습니다.