簡體   English   中英

帶小數部分的SQL FIFO庫存

[英]SQL FIFO Inventory with fractional quantities

我在這里和其他站點找到了大量有用的鏈接,以了解如何在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庫存處理小數數量? 我很難找到任何內容,到目前為止,根據我的理解,這種情況打破了我遇到的例子。

我一直在尋找一種高效且簡單易懂的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,這有助於我們找到下一個要賣的商品。

也可以計算為從FIFO_BUYING中選擇QUANTITY,CUM = sum(QUANTITY)超過(按日期划分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種不同。.滯后函數可以幫助我們解決很多問題,我們需要將當前行與前一個進行比較。

這對我來說比下一個要快得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM