目前有 BOM 和领料,需要根据 BOM 的需求数量,根据先进先出的原则,BOM 用了哪些领料,也就是列出那些领料对应哪条 BOM ,以及用掉多少,目前能想到的方案是用游标逐行判单,记录核销数量,但在数据量比较大的情况下,执行效率十分低,是否有比较高效的解决方案。
IF OBJECT_ID('tempdb.dbo.#BOM') IS NOT NULL DROP TABLE #BOM
CREATE TABLE #BOM
(
in_Code NVARCHAR(60),
in_Date DATETIME,
Orders NVARCHAR(60),
BOM_materials NVARCHAR(60),
in_Qty DECIMAL(18,4)
)
INSERT INTO #BOM
(in_Code, in_Date, Orders, BOM_materials, in_Qty)
VALUES (N'RK0001', '2022-03-08', N'A01', N'L01', 50),
(N'RK0001', '2022-03-08', N'A01', N'L02', 30),
(N'RK0002', '2022-03-15', N'A01', N'L01', 50)
SELECT * FROM #BOM
in_Code | in_Date | Orders | BOM_materials | in_Qty |
---|---|---|---|---|
RK0001 | 2022-03-05 | A01 | L01 | 50 |
RK0001 | 2022-03-05 | A01 | L02 | 30 |
RK0002 | 2022-03-18 | A01 | L01 | 50 |
IF OBJECT_ID('tempdb.dbo.#picking') IS NOT NULL DROP TABLE #picking
CREATE TABLE #picking
(
out_Code NVARCHAR(60),
out_Date DATETIME,
Orders NVARCHAR(60),
materials NVARCHAR(60),
out_Qty DECIMAL(18,4),
out_ID BIGINT
)
INSERT INTO #picking
(out_Code, out_Date, Orders, materials, out_Qty, out_ID)
VALUES (N'CK0001', '2022-01-08', N'A01', N'L01', 90, 1),
(N'CK0002', '2022-01-20', N'A01', N'L01', 70, 2),
(N'CK0003', '2022-01-30', N'A01', N'L02', 10, 3)
SELECT * FROM #picking
out_Code | out_Date | Orders | materials | out_Qty | out_ID |
---|---|---|---|---|---|
CK0001 | 2022-01-08 | A01 | L01 | 90 | 1 |
CK0002 | 2022-01-20 | A01 | L01 | 70 | 2 |
CK0003 | 2022-01-30 | A01 | L02 | 10 | 3 |
期望结果
in_Code | in_Date | Orders | BOM_materials | in_Qty | out_Code | out_Qty | need_Qty | out_id |
---|---|---|---|---|---|---|---|---|
RK0001 | 2022-03-05 | A01 | L01 | 50 | CK0001 | 90 | 50 | 1 |
RK0001 | 2022-03-05 | A01 | L02 | 30 | CK0003 | 10 | 10 | 3 |
RK0002 | 2022-03-18 | A01 | L01 | 50 | CK0001 | 90 | 40 | 1 |
RK0002 | 2022-03-18 | A01 | L01 | 50 | CK0002 | 70 | 10 | 2 |
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.