具有小数量的SQL FIFO库存

时间:2017-03-21 21:56:07

标签: sql tsql fifo inventory inventory-management

我在这里和其他网站上发现了大量有用的链接,介绍如何在SQL中实现FIFO运行总计和成本。它们似乎分为两类,即jar工作表方法中的bean,以及更具异国情调但指数级更快的CTE方法。

这是一篇非常好的文章,涵盖了两者:

https://www.simple-talk.com/sql/performance/set-based-speed-phreakery-the-fifo-stock-inventory-sql-problem/

这是擦 - 我的客户使用小数量。所以库存交易可以是24.13342平方码的东西。有没有人使用小数量的SQL库中的FIFO库存?我无法找到任何内容,而且到目前为止我所理解的是,这种情况打破了我遇到的例子。

1 个答案:

答案 0 :(得分:0)

我一直在寻找一个高效且简单易懂的FIFO查询。可悲的是我找不到任何东西,所以我做了自己的。

它是如何工作的;

首先,我们需要两个视图(或表或表返回函数或您喜欢的任何东西..),例如“ BUYING”和“ SELLING”;

CREATE TABLE FIFO_BUYING(
[ID] [int] IDENTITY(1,1) NOT NULL,
[UNITID] [int] NOT NULL,
[DATE] [smalldatetime] NOT NULL,
[UNIT_PRICE] [money] NOT NULL,
[QUANTITY] [float] NOT NULL,
[CUMULATIVE_QUANTITY] [float] NOT NULL)

CREATE TABLE FIFO_SELLING(
[ID] [int] IDENTITY(1,1) NOT NULL,
[UNITID] [int] NOT NULL,
[DATE] [smalldatetime] NOT NULL,
[UNIT_PRICE] [money] NOT NULL,
[QUANTITY] [float] NOT NULL,
[CUMULATIVE_QUANTITY] [float] NOT NULL)

insert into FIFO_BUYING([UNITID],[DATE],[UNIT_PRICE],[QUANTITY],[CUMULATIVE_QUANTITY]) values
(1,'2015-01-01 16:01',100.0,2.0,2.0),
(1,'2015-01-08 13:40',105.0,4.0,6.0),
(1,'2015-01-08 14:11',102.0,2.0,8.0),
(1,'2015-01-12 14:00',101.0,7.0,15.0),
(1,'2015-01-14 17:55',103.0,5.0,20.0)

insert into FIFO_SELLING([UNITID],[DATE],[UNIT_PRICE],[QUANTITY],[CUMULATIVE_QUANTITY]) values
(1,'2015-01-02 10:21',150.0,1.0,1.0),
(1,'2015-01-08 13:45',140.0,3.0,4.0),
(1,'2015-01-10 17:30',145.0,3.0,7.0),
(1,'2015-01-10 17:55',130.0,5.0,12.0),
(1,'2015-01-15 12:15',135.0,6.0,18.0)

名为CUMULATIVE_QUANTITY的字段应该从每一行开始就对QUANTITY进行累积求和,这有助于我们找到下一步要出售的商品。

也可以通过选择QUANTITY,CUM = sum(QUANTITY)来计算(从DATE_BUYING开始按UNITID顺序划分)

反正..

select 
BUYING_ID=B.ID,
SELLING_ID=S.ID,
BUYING_DATE=B.[DATE],
SELLING_DATE=S.[DATE],
QUANTITY=(case when S.CUMULATIVE_QUANTITY<B.CUMULATIVE_QUANTITY then S.CUMULATIVE_QUANTITY else B.CUMULATIVE_QUANTITY end) 
                - isnull(lag(case when S.CUMULATIVE_QUANTITY<B.CUMULATIVE_QUANTITY then S.CUMULATIVE_QUANTITY else B.CUMULATIVE_QUANTITY end) 
                    over (order by case when S.CUMULATIVE_QUANTITY<B.CUMULATIVE_QUANTITY then S.CUMULATIVE_QUANTITY else B.CUMULATIVE_QUANTITY end),0.0),
BUYING_UNIT_PRICE=B.UNIT_PRICE,
SELLING_UNIT_PRICE=S.UNIT_PRICE,
PROFIT_PER_UNIT=S.UNIT_PRICE-B.UNIT_PRICE
from
(select top 1000000 * from FIFO_BUYING order by [DATE]) B join
(select top 1000000 * from FIFO_SELLING order by [DATE]) S on 
B.CUMULATIVE_QUANTITY-B.QUANTITY<S.CUMULATIVE_QUANTITY and
S.CUMULATIVE_QUANTITY-S.QUANTITY<B.CUMULATIVE_QUANTITY

第一个技巧是联接,它将正确的行彼此连接,并删除这些视图之间的无意义的连接(在处,这是完全联接。)

我们确保两个视图均按最终查询中的日期排序,如果您已经在视图中完成了此操作,则不必这样做。

第二个技巧是计算正确的数量,因为买卖有2种不同。.滞后函数可以帮助我们解决很多问题,我们需要将当前行与前一个进行比较。

对我来说,此方法比下一个获取方法快。