我已经尝试用CTE解决以下问题大约6个小时了,我开始怀疑自己是否可以。鉴于下表:
CREATE TABLE [dbo].[INV](
[InvID] [int] IDENTITY(1,1) NOT NULL,
[Product] [varchar](50) NULL,
[TransactionCode] [char](2) NULL,
[Qty] [decimal](15, 6) NULL,
[FromWhse] [char](2) NULL,
[ToWhse] [char](2) NULL,
[TransactionDate] [datetime] NULL,
CONSTRAINT [PK_TRHIST] PRIMARY KEY CLUSTERED
(
[InvID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
SET IDENTITY_INSERT [dbo].[INV] ON
INSERT [dbo].[INV] ([InvID], [Product], [TransactionCode], [Qty], [FromWhse], [ToWhse], [TransactionDate]) VALUES (1, N'Product1', N'PR', CAST(100.000000 AS Decimal(15, 6)), N'W1', NULL, CAST(0x0000A6EE00000000 AS DateTime))
INSERT [dbo].[INV] ([InvID], [Product], [TransactionCode], [Qty], [FromWhse], [ToWhse], [TransactionDate]) VALUES (2, N'Product1', N'PR', CAST(200.000000 AS Decimal(15, 6)), N'W2', NULL, CAST(0x0000A6EF00000000 AS DateTime))
INSERT [dbo].[INV] ([InvID], [Product], [TransactionCode], [Qty], [FromWhse], [ToWhse], [TransactionDate]) VALUES (3, N'Product1', N'TO', CAST(150.000000 AS Decimal(15, 6)), N'W2', N'D1', CAST(0x0000A6F000000000 AS DateTime))
INSERT [dbo].[INV] ([InvID], [Product], [TransactionCode], [Qty], [FromWhse], [ToWhse], [TransactionDate]) VALUES (4, N'Product1', N'SA', CAST(100.000000 AS Decimal(15, 6)), N'D1', NULL, CAST(0x0000A6F100000000 AS DateTime))
INSERT [dbo].[INV] ([InvID], [Product], [TransactionCode], [Qty], [FromWhse], [ToWhse], [TransactionDate]) VALUES (5, N'Product1', N'TO', CAST(50.000000 AS Decimal(15, 6)), N'W1', N'D1', CAST(0x0000A6F200000000 AS DateTime))
INSERT [dbo].[INV] ([InvID], [Product], [TransactionCode], [Qty], [FromWhse], [ToWhse], [TransactionDate]) VALUES (6, N'Product1', N'SA', CAST(75.000000 AS Decimal(15, 6)), N'D1', NULL, CAST(0x0000A6F300000000 AS DateTime))
INSERT [dbo].[INV] ([InvID], [Product], [TransactionCode], [Qty], [FromWhse], [ToWhse], [TransactionDate]) VALUES (7, N'Product2', N'PR', CAST(300.000000 AS Decimal(15, 6)), N'W1', NULL, CAST(0x0000A6F400000000 AS DateTime))
SET IDENTITY_INSERT [dbo].[INV] OFF
这是库存交易表的非常简化版本。 3个交易代码是' PR' - 生产,' TO' - 转储单和' SA'出售。样本数据:
因此,我能找到的所有FIFO示例似乎都集中在以先进/先出为基础对库存进行评估。这个更多的是以先进/先出的方式对各种仓库进行贷记。我想我可以放心地忽略' PR'记录,我只关心销售和转让。因此,鉴于上述交易顺序,1月4日出售100个单位应记入W2,因为该出售时唯一的库存是W2的150个单位。然后D1将从W2剩下50个单位。 1月5日,W1将50个单位转移到D1。 D1现在有100个单位,每个W1和W2有50个单位。现在1月6日,D1售出75个单位。因此,基于FIFO,应从W2的库存中扣除50个单位,然后从W1的库存中扣除25个单位。所以我需要的输出看起来像这样:
前5列来自销售/' SA'交易。我知道如果从多个来源完成订单,他们将被复制。剩下的列是来自' TO'的字段。来自源仓库的事务。我觉得我可以通过CTE来解决这个问题并且已经尝试这么做了很长一段时间而且我无法做到这一点。也许我已经盯着我的代码太久了。这可能与CTE有关吗?我对其他选项持开放态度,但如果可以的话,我想避开光标,因为它有很多记录。