[英]SQL FIFO Inventory with fractional quantities
我在這里和其他站點找到了大量有用的鏈接,以了解如何在SQL中實現FIFO運行總計和成本。 它們似乎分為兩類,即jar工作表方法中的bean和更奇特,但指數級更快的CTE方法。
這是一篇很好的文章,涵蓋了以下兩個方面:
這是麻煩所在-我的客戶使用小數。 因此,庫存交易量可能為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.