728x90
반응형
MSSQL에 일자별로 입력된 데이터로 선입 선출을 적용하여 계산할 일이 생겼습니다. 선입 선출을 적용한다는 게 해본 적이 없으니 생소하고 어렵게만 생각했으나 이해한 내용을 바탕으로 기록으로 남기고자 작성합니다.
여러 가지 방법으로 구현이 가능하겠으나 제가 이해하고 이를 응용하여 사용하기도 하였습니다.
그리고 입력되어 있는 데이터 중에서 먼저 입력된 데이터를 먼저 차감하는게 이번 선입 선출 적용의 목적입니다.
* 선입 선출이란?
https://ko.wikipedia.org/wiki/%EC%84%A0%EC%9E%85_%EC%84%A0%EC%B6%9C
* 예제 (재고라고 가정할 데이터)
declare @input_qt int set @input_qt = 1000; WITH temp AS ( --아래와 같이 데이터가 입력되어 있다는걸 보이기 위해 사용 SELECT 1 num, 100 AS stock UNION ALL SELECT 2 num, 200 AS stock UNION ALL SELECT 3 num, 300 AS stock UNION ALL SELECT 4 num, 500 AS stock ), tablenm AS ( SELECT a.num, a.stock, CASE WHEN SUM(b.stock) - @input_qt < 0 THEN a.stock ELSE a.stock - (SUM(b.stock) - @input_qt) END used_qt FROM temp a LEFT JOIN temp b ON b.num <= a.num GROUP BY a.num, a.stock ) --결과 SELECT a.num, a.stock, a.used_qt, (a.stock - a.used_qt) AS rem_qt FROM tablenm a |
* 칼럼 설명
- num : 순번
- stock : 재고 수량
- used_qt : 사용한 수량
- rem_qt : 남은 수량
* 결과
- 'num' 칼럼의 순서대로 값(값의 총합은 1,100)이 입력되어 있습니다. 예제에서 보듯이 1,000(@input_qt) 값이 들어왔을 때 순서대로 'stock' 칼럼에 있는 값만큼 사용(100, 200, 300)하고 남은 나머지(400)를 마저 사용하고 나면 '100'이라는 값이 남게 됩니다.
간단한 예제로 선입 선출 목표를 달성하였습니다.
위의 쿼리문에서 @input만 바꾸어 결과를 본다면 더욱 이해가 빠르리라 생각됩니다.
말 재주도 없는데 말로 풀어 쓸려니 쉽지 않습니다..
728x90
반응형
'컴퓨터 > MSSQL' 카테고리의 다른 글
MSSQL 서버 접속 시 액세스 거부 해결 방법 (0) | 2022.06.15 |
---|---|
MSSQL WITH 구문 사용 방법 (단일(?), 다중(?) 변수) (0) | 2021.03.24 |
MSSQL 버전 확인 (쿼리문, 간단) (0) | 2021.02.24 |
MSSQL 날짜 형식 (Date Format) (0) | 2021.02.24 |
MSSQL 연결된 서버 사용하기 (Linked Server) (0) | 2021.01.28 |