34,590
社区成员
发帖
与我相关
我的任务
分享
;WITH ctea AS (
SELECT 物料,SUM(库存) AS 库存 FROM #库存表 GROUP BY 物料
),cteb AS (
SELECT ctea.*,是否可整包发料,包装数量 FROM ctea JOIN #物料表 ON #物料表.物料 = ctea.物料
),ctec AS (
SELECT 物料,SUM(需要发料数量) AS 需要发料数量 FROM #需要发料表 GROUP BY 物料
),cted AS (
SELECT
cteb.物料,
ctec.需要发料数量,
CASE
WHEN ctec.需要发料数量 >= cteb.库存
THEN cteb.库存
ELSE
ctec.需要发料数量
END AS 发料,
CASE
WHEN ctec.需要发料数量 >= cteb.库存
THEN cteb.库存
WHEN 是否可整包发料=0 THEN ctec.需要发料数量
ELSE
(CASE WHEN ctec.需要发料数量%包装数量=0 THEN ctec.需要发料数量 ELSE ((ctec.需要发料数量/包装数量)+1)*包装数量 END)
END AS 实发数量
FROM
ctec
JOIN
cteb
ON cteb.物料 = ctec.物料
)
SELECT *,cted.实发数量-cted.发料 AS 多发 FROM cted
;WITH ctea AS (
SELECT
#库存表.物料,
ISNULL(批号, '001') AS 批号,
库存,
是否可整包发料,
包装数量,
ROW_NUMBER()OVER(PARTITION BY #库存表.物料 ORDER BY ISNULL(批号, 'A001')) rn
FROM
#库存表
JOIN
#物料表
ON #物料表.物料 = #库存表.物料
),cteb AS (
SELECT
ctea.*,
#需要发料表.需要发料数量 - ctea.库存 AS tempkc,
CASE WHEN #需要发料表.需要发料数量 - ctea.库存>0 THEN ctea.库存 ELSE #需要发料表.需要发料数量 END 发料数量,
CASE WHEN #需要发料表.需要发料数量 - ctea.库存>0 THEN ctea.库存
WHEN ctea.是否可整包发料=0 THEN #需要发料表.需要发料数量
ELSE
(CASE WHEN #需要发料表.需要发料数量%ctea.包装数量=0 THEN #需要发料表.需要发料数量 ELSE ((#需要发料表.需要发料数量/ctea.包装数量)+1)*ctea.包装数量 END)
END 实发数量
FROM
#需要发料表
JOIN
ctea
ON ctea.物料 = #需要发料表.物料
AND ctea.rn = 1
UNION ALL
SELECT ctea.*,cteb.tempkc-ctea.库存 AS tempkc,
CASE WHEN tempkc - ctea.库存>0 THEN ctea.库存 ELSE tempkc END 发料数量,
CASE WHEN tempkc - ctea.库存>0 THEN ctea.库存
WHEN ctea.是否可整包发料=0 THEN tempkc
ELSE
(CASE WHEN tempkc %ctea.包装数量=0 THEN tempkc ELSE ((tempkc /ctea.包装数量)+1)*ctea.包装数量 END)
END 实发数量
FROM cteb JOIN ctea ON ctea.物料 = cteb.物料 AND ctea.rn = cteb.rn+1 AND cteb.tempkc>0
)
SELECT
cteb.物料,
CASE
WHEN cteb.批号 = '001'
THEN ''
ELSE
cteb.批号
END 批号,
cteb.实发数量 - cteb.发料数量 AS 发料数量
FROM
cteb
WHERE
cteb.实发数量 > cteb.发料数量
ORDER BY
cteb.物料,
cteb.批号;
;WITH ctea AS (
SELECT
#库存表.物料,
ISNULL(批号, '001') AS 批号,
库存,
是否可整包发料,
包装数量,
ROW_NUMBER()OVER(PARTITION BY #库存表.物料 ORDER BY ISNULL(批号, 'A001')) rn
FROM
#库存表
JOIN
#物料表
ON #物料表.物料 = #库存表.物料
),cteb AS (
SELECT
ctea.*,
#需要发料表.需要发料数量 - ctea.库存 AS tempkc,
CASE WHEN #需要发料表.需要发料数量 - ctea.库存>0 THEN ctea.库存 ELSE #需要发料表.需要发料数量 END 发料数量,
CASE WHEN #需要发料表.需要发料数量 - ctea.库存>0 THEN ctea.库存
WHEN ctea.是否可整包发料=0 THEN #需要发料表.需要发料数量
ELSE
(CASE WHEN #需要发料表.需要发料数量%ctea.包装数量=0 THEN #需要发料表.需要发料数量 ELSE ((#需要发料表.需要发料数量/ctea.包装数量)+1)*ctea.包装数量 END)
END 实发数量
FROM
#需要发料表
JOIN
ctea
ON ctea.物料 = #需要发料表.物料
AND ctea.rn = 1
UNION ALL
SELECT ctea.*,cteb.tempkc-ctea.库存 AS tempkc,
CASE WHEN tempkc - ctea.库存>0 THEN ctea.库存 ELSE tempkc END 发料数量,
CASE WHEN tempkc - ctea.库存>0 THEN ctea.库存
WHEN ctea.是否可整包发料=0 THEN tempkc
ELSE
(CASE WHEN tempkc %ctea.包装数量=0 THEN tempkc ELSE ((tempkc /ctea.包装数量)+1)*ctea.包装数量 END)
END 实发数量
FROM cteb JOIN ctea ON ctea.物料 = cteb.物料 AND ctea.rn = cteb.rn+1 AND cteb.tempkc>0
),ctec AS (
SELECT 物料,SUM(cteb.发料数量) AS 发料数量,SUM(实发数量) AS 实发数量 FROM cteb GROUP BY cteb.物料
)
SELECT
#需要发料表.物料,
需要发料数量,
ctec.发料数量,
ctec.实发数量,
ctec.实发数量 - ctec.发料数量 AS 多发
FROM
#需要发料表
LEFT JOIN
ctec
ON ctec.物料 = #需要发料表.物料;
--测试数据
if not object_id(N'Tempdb..#物料表') is null
drop table #物料表
Go
Create table #物料表([物料] nvarchar(21),[是否启动批号] int,[是否可整包发料] int,[包装数量] int)
Insert #物料表
select N'A',0,0,0 union all
select N'B',1,0,0 union all
select N'C',1,1,20 union all
select N'D',0,1,100 union all
select N'E',1,1,50
GO
if not object_id(N'Tempdb..#库存表') is null
drop table #库存表
Go
Create table #库存表([物料] nvarchar(21),[批号] nvarchar(24),[库存] int)
Insert #库存表
select N'A',null,20 union all
select N'B',N'B001',20 union all
select N'B',N'B002',10 union all
select N'B',N'B003',50 union all
select N'C',N'C001',20 union all
select N'C',N'C002',25 union all
select N'C',N'C003',200 union all
select N'D',null,220 union all
select N'E',N'E001',5 union all
select N'E',N'E002',10
GO
if not object_id(N'Tempdb..#需要发料表') is null
drop table #需要发料表
Go
Create table #需要发料表([物料] nvarchar(21),[需要发料数量] int)
Insert #需要发料表
select N'A',60 union all
select N'B',50 union all
select N'C',75 union all
select N'D',110 union all
select N'E',60
Go
--测试数据结束
;WITH ctea AS (
SELECT
#库存表.物料,
ISNULL(批号, 'A001') AS 批号,
库存,
是否可整包发料,
包装数量,
ROW_NUMBER()OVER(PARTITION BY #库存表.物料 ORDER BY ISNULL(批号, 'A001')) rn
FROM
#库存表
JOIN
#物料表
ON #物料表.物料 = #库存表.物料
),cteb AS (
SELECT
ctea.*,
#需要发料表.需要发料数量 - ctea.库存 AS tempkc,
CASE WHEN #需要发料表.需要发料数量 - ctea.库存>0 THEN ctea.库存 ELSE #需要发料表.需要发料数量 END 发料数量
FROM
#需要发料表
JOIN
ctea
ON ctea.物料 = #需要发料表.物料
AND ctea.rn = 1
UNION ALL
SELECT ctea.*,cteb.tempkc-ctea.库存 AS tempkc,
CASE WHEN tempkc - ctea.库存>0 THEN ctea.库存 ELSE tempkc END 发料数量
FROM cteb JOIN ctea ON ctea.物料 = cteb.物料 AND ctea.rn = cteb.rn+1 AND cteb.tempkc>0
)
SELECT 物料,CASE WHEN 批号='A001' THEN '' ELSE 批号 END 批号,cteb.发料数量 FROM cteb ORDER BY cteb.物料,cteb.批号