Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 метод FIFO  [new]
ВВасек
Member

Откуда:
Сообщений: 21
Здравствуйте. У меня есть таблица с двумя полями дата поступления и количество товара.
Например
CREATE TABLE SSS
(
kol int NOT NULL ,
ddate smalldatetime NOT NULL
)

Как мне сделать списание товара по методу FIFO - то есть выбрать поставки с наименьшей датой которые не превышали заданное количество. То есть например если таблица содержит данные:
1/1/2011 10
2/1/2011 3
3/1/2011 4

то при числе 11 я должен получить 2 строки
1/1/2011 10
2/1/2011 1
14 июл 11, 11:19    [10971977]     Ответить | Цитировать Сообщить модератору
 Re: метод FIFO  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
https://www.sql.ru/forum/actualtopics.aspx?search=fifo&submit=%CD%E0%E9%F2%E8&bid=1
14 июл 11, 11:19    [10971982]     Ответить | Цитировать Сообщить модератору
 Re: метод FIFO  [new]
ВВасек
Member

Откуда:
Сообщений: 21
а запросом можете помоч.
14 июл 11, 11:59    [10972379]     Ответить | Цитировать Сообщить модератору
 Re: метод FIFO  [new]
studieren
Member

Откуда: Tashkent, Uzbekistan
Сообщений: 2845
ВВасек,

Я не знаю какая версия у Вашего сервера, поэтому на всякий случай попробовал в стиле SQL 2000.
-- Исходные данные
CREATE TABLE #SSS
(
kol int NOT NULL ,
ddate smalldatetime NOT NULL
);
INSERT INTO #SSS
SELECT 10, '20110101'
UNION ALL SELECT 3, '20110102'
UNION ALL SELECT 4, '20110103';

DECLARE @P Int = 11;


-- Теперь попробуем решить.
CREATE TABLE #Temp
(RowN Int Identity(1, 1), DDate Smalldatetime, Quantity Int, Total Int);

INSERT INTO #Temp (Quantity, DDate)
SELECT * FROM #SSS
ORDER BY ddate, kol;

UPDATE #Temp
SET Total = TQ.Total
FROM #Temp AS T INNER JOIN
    (SELECT T1.RowN, SUM(T2.Quantity) AS Total
    FROM #Temp AS T1 INNER JOIN #Temp AS T2 ON T1.RowN >= T2.RowN
    GROUP BY T1.RowN) AS TQ ON T.RowN = TQ.RowN;

SELECT
    T.DDate,
    T.Quantity-CASE WHEN T.RowN <> MT.N THEN 0 ELSE MT.T-@p END AS Quant
FROM #Temp AS T INNER JOIN
    (SELECT MIN(RowN) AS N, MIN(Total) AS T FROM #Temp
    WHERE Total >= @P) AS MT ON T.RowN <= MT.N;

DROP TABLE #SSS;
DROP TABLE #Temp;
14 июл 11, 13:12    [10973172]     Ответить | Цитировать Сообщить модератору
 Re: метод FIFO  [new]
studieren
Member

Откуда: Tashkent, Uzbekistan
Сообщений: 2845
Небольшая поправочка!
последний кусок SELECTа надо подправить так:
SELECT
    T.DDate,
    T.Quantity-CASE WHEN T.RowN <> ISNULL(MT.N, 0) THEN 0 ELSE ISNULL(MT.T, 0)-@p END AS Quant
FROM #Temp AS T LEFT JOIN
    (SELECT MIN(RowN) AS N, MIN(Total) AS T FROM #Temp
    WHERE Total >= @P) AS MT ON T.RowN <= MT.N;

А так запрос вполне рабочий.
14 июл 11, 13:17    [10973229]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить