【问题标题】:calculate closing Stock Quantity,price & value by FIFO通过 FIFO 计算收盘库存数量、价格和价值
【发布时间】:2014-11-06 10:35:59
【问题描述】:

我使用的是 sql server 2008。

我将 envetory 计算为 FIFO 方法,就像在理货中一样。

请通过

http://accountingexplained.com/financial/inventories/fifo-method

我有桌子

创建表#Stock ( StoreId int, ProductId 整数, Transction_Date 日期, transsectionType varchar(20), 单位数字(18,2), UnitCost 数字(18,2) )

insert into #Stock  select 1,201, '2014-03-01', 'Beginning Inventory', 68, 14
insert into #Stock  select 1,201,'2014-03-05', 'Purchase', 140, 15.50
insert into #Stock  select 1,201,'2014-03-09', 'Issue', 94, 0
insert into #Stock  select 1,201,'2014-03-11', 'Purchase', 40, 16
insert into #Stock  select 1,201,'2014-03-16', 'Purchase', 68, 14
insert into #Stock  select 1,201,'2014-03-20', 'Issue', 116, 0 
insert into #Stock  select 1,201,'2014-03-29', 'Issue', 62, 0

从#Stock 中选择 * 删除表#Stock

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

并显示为给定格式

【问题讨论】:

  • 请说明您的尝试,因为这样我们更容易为您提供帮助。
  • 确保您的库存表将购买和销售处理为加减法和 presto....
  • @naweez 我的回答解决了你的问题吗?
  • 根据你的计算是正确的,但我怀疑根据 FIFO 是错误的明天我会告诉你
  • @naweez 根据您的链接,答案应该是 54、16.5 美元和 891 美元。请解释你怎么说它应该是 54 16.19354839 874.4516129 因为我看不到任何东西告诉我这是如何计算的。

标签: sql-server sql-server-2008


【解决方案1】:

怎么样:

--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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2020-09-16
    • 2021-12-10
    • 1970-01-01
    相关资源
    最近更新 更多