Sql server 通过FIFO计算期末库存数量、价格和价值

Sql server 通过FIFO计算期末库存数量、价格和价值,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我正在使用SQLServer2008 我计算环境作为先进先出法一样,理货 请通过 我有一张桌子 创建表格库存 StoreId int, ProductId int, 横断面图日期, 横切型varchar20, 单位编号18,2, 单位成本数字18,2 从库存中选择* 下桌存货 我正在寻找接受参数的sql函数或存储过程 fromDate、toDate和sorteId 并按给定格式显示 那么: --DROP TABLE #Stock create table #Stock ( Transect

我正在使用SQLServer2008

我计算环境作为先进先出法一样,理货

请通过

我有一张桌子

创建表格库存 StoreId int, ProductId int, 横断面图日期, 横切型varchar20, 单位编号18,2, 单位成本数字18,2

从库存中选择* 下桌存货

我正在寻找接受参数的sql函数或存储过程 fromDate、toDate和sorteId

并按给定格式显示

那么:

--DROP TABLE #Stock
create table #Stock 
( 
Transection_Date Date,
transectionType varchar(20),
Unit numeric(18,2),
UnitCost numeric(18,2)
)

--Mar 1 Beginning Inventory 68 units @ $15.00 per unit 
--5 Purchase 140 units @ $15.50 per unit 
--9 Sale 94 units @ $19.00 per unit 
--11 Purchase 40 units @ $16.00 per unit 
--16 Purchase 78 units @ $16.50 per unit 
--20 Sale 116 units @ $19.50 per unit 
--29 Sale 62 units @ $21.00 per unit 

insert into #Stock  select '2014-03-01', 'Beginning Inventory', 68, 15
insert into #Stock  select '2014-03-05', 'Purchase', 140, 15.50
insert into #Stock  select '2014-03-09', 'Sale', 94, 19
insert into #Stock  select '2014-03-11', 'Purchase', 40, 16
insert into #Stock  select '2014-03-16', 'Purchase', 78, 16.5
insert into #Stock  select '2014-03-20', 'Sale', 116, 19.50 
insert into #Stock  select '2014-03-29', 'Sale', 62, 21.00

;WITH UnitsCTE
AS
(
-- GET Total Units Left
    SELECT SUM(
            CASE transectionType 
            WHEN 'Purchase' Then Unit 
            When 'Sale' THEN Unit * -1 
            ELSE Unit END) AS Units
    FROM #Stock
), PurchaseCTE
AS
(
-- Get only purchases in reverse order
    SELECT Unit, UnitCost, Transection_Date, ROW_NUMBER() OVER (ORDER BY Transection_Date DESC ) AS RN
    FROM #Stock
    WHERE transectionType <> 'Sale'
),
UnitCost
AS
(
-- Recursive CTE to get number of units left at each price
    SELECT CASE WHEN Unit > UnitsCTE.Units THEN UnitsCTE.Units ELSE Unit END As Units, UnitCost
    FROM PurchaseCTE 
    CROSS APPLY UnitsCTE
    WHERE RN = 1
    UNION ALL
    SELECT CASE WHEN P1.Unit > (UnitsCTE.Units - (SELECT SUM(Unit) FROM PurchaseCTE P3 WHERE p3.RN < p1.RN))
            THEN    CASE WHEN (UnitsCTE.Units - (SELECT SUM(Unit) FROM PurchaseCTE P3 WHERE p3.RN < p1.RN)) < 0 THEN 0
                        ELSE (UnitsCTE.Units - (SELECT SUM(Unit) FROM PurchaseCTE P3 WHERE p3.RN < p1.RN)) END
            ELSE P1.Unit END,
            P1.UnitCost 
    FROM PurchaseCTE P1
    INNER JOIN PurchaseCTE P2
        ON P1.RN = P2.RN + 1
    CROSS APPLY UnitsCTE
)
SELECT SUM(Units), SUM(UnitCost * Units) / SUM(Units) AS UnitCost, SUM(Units * UnitCost) AS TotalCost
FROM UnitCost
WHERE Units > 0

请解释一下你试过什么,因为这使我们更容易帮助您。确保您的库存表以加减法和普雷斯托法处理购买和销售…@naweez我的回答解决了您的问题吗?根据您的计算是正确的,但我怀疑根据FIFO,明天我会让您知道know@naweez根据你的链接,答案应该是54,16.5美元和891美元。请解释一下你怎么说它应该是54 16.19354839 874.4516129,因为我看不到任何东西可以告诉我这是如何计算的。
--DROP TABLE #Stock
create table #Stock 
( 
Transection_Date Date,
transectionType varchar(20),
Unit numeric(18,2),
UnitCost numeric(18,2)
)

--Mar 1 Beginning Inventory 68 units @ $15.00 per unit 
--5 Purchase 140 units @ $15.50 per unit 
--9 Sale 94 units @ $19.00 per unit 
--11 Purchase 40 units @ $16.00 per unit 
--16 Purchase 78 units @ $16.50 per unit 
--20 Sale 116 units @ $19.50 per unit 
--29 Sale 62 units @ $21.00 per unit 

insert into #Stock  select '2014-03-01', 'Beginning Inventory', 68, 15
insert into #Stock  select '2014-03-05', 'Purchase', 140, 15.50
insert into #Stock  select '2014-03-09', 'Sale', 94, 19
insert into #Stock  select '2014-03-11', 'Purchase', 40, 16
insert into #Stock  select '2014-03-16', 'Purchase', 78, 16.5
insert into #Stock  select '2014-03-20', 'Sale', 116, 19.50 
insert into #Stock  select '2014-03-29', 'Sale', 62, 21.00

;WITH UnitsCTE
AS
(
-- GET Total Units Left
    SELECT SUM(
            CASE transectionType 
            WHEN 'Purchase' Then Unit 
            When 'Sale' THEN Unit * -1 
            ELSE Unit END) AS Units
    FROM #Stock
), PurchaseCTE
AS
(
-- Get only purchases in reverse order
    SELECT Unit, UnitCost, Transection_Date, ROW_NUMBER() OVER (ORDER BY Transection_Date DESC ) AS RN
    FROM #Stock
    WHERE transectionType <> 'Sale'
),
UnitCost
AS
(
-- Recursive CTE to get number of units left at each price
    SELECT CASE WHEN Unit > UnitsCTE.Units THEN UnitsCTE.Units ELSE Unit END As Units, UnitCost
    FROM PurchaseCTE 
    CROSS APPLY UnitsCTE
    WHERE RN = 1
    UNION ALL
    SELECT CASE WHEN P1.Unit > (UnitsCTE.Units - (SELECT SUM(Unit) FROM PurchaseCTE P3 WHERE p3.RN < p1.RN))
            THEN    CASE WHEN (UnitsCTE.Units - (SELECT SUM(Unit) FROM PurchaseCTE P3 WHERE p3.RN < p1.RN)) < 0 THEN 0
                        ELSE (UnitsCTE.Units - (SELECT SUM(Unit) FROM PurchaseCTE P3 WHERE p3.RN < p1.RN)) END
            ELSE P1.Unit END,
            P1.UnitCost 
    FROM PurchaseCTE P1
    INNER JOIN PurchaseCTE P2
        ON P1.RN = P2.RN + 1
    CROSS APPLY UnitsCTE
)
SELECT SUM(Units), SUM(UnitCost * Units) / SUM(Units) AS UnitCost, SUM(Units * UnitCost) AS TotalCost
FROM UnitCost
WHERE Units > 0