22,209
社区成员
发帖
与我相关
我的任务
分享
declare @pid int,@auxneed float
select @pid=1, --> 严谨来讲,需指定产品ID
@auxneed=500
;with t as(
select 仓库ID,库存数量,rn=row_number() over(order by 库存数量)
from 表A
where 产品ID=@pid and 库存数量>0),
u as(
select a.*,sq=(select sum(b.库存数量) from t b where b.rn<=a.rn)
from t a),
v as(
select 仓库ID,
qty=case when @auxneed>=sq then u.库存数量
when @auxneed<sq and @auxneed>(sq-库存数量) then @auxneed-(sq-库存数量)
else 0 end
from u)
insert into 表B(产品ID,仓库ID,出库数量)
select @pid,
仓库ID,
qty
from v
where qty>0
-- 结果
select * from 表B
/*
产品ID 仓库ID 出库数量
----------- ----------- ----------------------
1 1 100
1 2 200
1 3 200
(3 row(s) affected)
*/
CREATE TABLE [表A](
[产品ID] [int] NULL,
[仓库ID] [int] NULL,
[库存数量] [float] NULL
)
create table 表B(
[产品ID] [int] NULL,
[仓库ID] [int] NULL,
[出库数量] [float] NULL
)
INSERT INTO 表A values(1.01,1,100)
INSERT INTO 表A values(1.01,2,200)
INSERT INTO 表A values(1.01,3,300)
INSERT INTO 表A values(1.01,4,400)
declare @auxneed float
set @auxneed=500
;WITH TA AS
(
SELECT a.产品ID,a.仓库ID,a.库存数量 - b.出库数量 AS 库存数量
FROM dbo.表A a
CROSS APPLY(SELECT ISNULL(SUM(出库数量),0) AS 出库数量 FROM dbo.表B WHERE a.产品ID = 产品ID AND a.仓库ID = 仓库ID ) b
WHERE a.库存数量 > b.出库数量
),CTE AS(
SELECT a.产品ID,a.仓库ID,MAX(a.库存数量) AS 库存数量,
ISNULL(SUM(b.库存数量),0) AS 总库存
FROM TA a
LEFT JOIN TA b ON a.产品ID = b.产品ID AND a.仓库ID > b.仓库ID
GROUP BY a.产品ID,a.仓库ID)
INSERT INTO dbo.表B
( 产品ID, 仓库ID, 出库数量 )
SELECT CTE.产品ID,CTE.仓库ID,CASE WHEN @auxneed > CTE.总库存 + CTE.库存数量 THEN 库存数量 ELSE @auxneed - CTE.总库存 END
FROM CTE
WHERE 总库存 < @auxneed
DROP TABLE dbo.表A
DROP TABLE dbo.表B