컴퓨터/MSSQL

MSSQL 선입 선출 적용 방법(feat. WITH 구문)

k1asd1 2021. 3. 24. 18:13
728x90
반응형

MSSQL에 일자별로 입력된 데이터로 선입 선출을 적용하여 계산할 일이 생겼습니다. 선입 선출을 적용한다는 게 해본 적이 없으니 생소하고 어렵게만 생각했으나 이해한 내용을 바탕으로 기록으로 남기고자 작성합니다.

 

여러 가지 방법으로 구현이 가능하겠으나 제가 이해하고 이를 응용하여 사용하기도 하였습니다.

 

그리고 입력되어 있는 데이터 중에서 먼저 입력된 데이터를 먼저 차감하는게 이번 선입 선출 적용의 목적입니다.

 

 

* 선입 선출이란?

https://ko.wikipedia.org/wiki/%EC%84%A0%EC%9E%85_%EC%84%A0%EC%B6%9C

 

선입 선출 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 선입선출의 개요도. 선입 선출(先入先出, first in, first out, 줄여서 FIFO)은 시간과 우선 순위와 관련된 데이터를 정리하고 이용하는 방식을 줄여 말하는 것이다.

ko.wikipedia.org


* 예제 (재고라고 가정할 데이터)

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
반응형