库存(EcStorage) PO Item Qty PO1 ItemA 88 PO1 ItenB 78 PO2 ItemA 78 P02 ItenB 78 出货(Ship) Item Qty ItemA 30 ItemB 100 运行结果 Item Qty ItemA 58 ItemB 0 ItemA 78 ItemB 56 请使用SQL语句: 1.根据出货单判断库存里对应的每个Iten总数量是否足够2.整个Iten 数量足够,在库存表逐行减掉对应的出货数量,并更新数量,当前行数量不够,移到对应Item的下一行减掉,当前行数量减到0,并更新对应库存数量 请用最简单的方式写出来并注释每一行
时间: 2024-03-06 12:49:03 浏览: 130
以下是最简单的方式写出来并注释每一行:
1. 根据出货单判断库存里对应的每个Item总数量是否足够:
```
-- 查询每个Item的数量和对应出货数量
SELECT Item, SUM(Qty) - COALESCE(ShipQty, 0) AS RemainQty
-- 计算每个Item的RemainQty
FROM (
-- 查询库存表中每个Item的数量
SELECT ecstorage.Item, ecstorage.Qty,
-- 查询出货单中每个Item的出货数量
SUM(ship.Qty) AS ShipQty
FROM ecstorage
-- 左连接出货单
LEFT JOIN ship ON ecstorage.Item = ship.Item
GROUP BY ecstorage.Item, ecstorage.Qty
) t
-- 查找RemainQty小于0的Item
GROUP BY Item
HAVING RemainQty < 0;
```
2. 整个Item数量足够,在库存表逐行减掉对应的出货数量,并更新数量:
```
-- 逐行更新库存和出货单的数量
UPDATE ecstorage
SET Qty = CASE
-- 如果当前行的数量足够,则直接减掉出货数量
WHEN Qty >= ShipQty THEN Qty - ShipQty
-- 如果当前行的数量不够,则移到下一行继续减掉数量,直到当前行数量减到0
ELSE (SELECT SUM(Qty) FROM ecstorage WHERE Item = s.Item AND Qty > 0)
END
-- 计算每个Item的出货数量
FROM (
SELECT Item, SUM(Qty) AS ShipQty
FROM ship
GROUP BY Item
) s
-- 更新库存表中对应Item的数量
WHERE ecstorage.Item = s.Item AND ShipQty > 0;
-- 更新已经出货完毕的Item的数量为0
UPDATE ship SET Qty = 0 WHERE Qty <= 0;
```
以上SQL语句中,第一个语句使用子查询计算每个Item的总数量和对应出货数量,如果有任何一个Item的RemainQty小于0,说明库存不足,需要进一步处理。第二个语句使用CASE语句逐行更新库存和出货单的数量,如果库存中当前行的数量不够,则移到对应Item的下一行继续减掉数量,直到当前行数量减到0。最后一个语句用于将已经出货完毕的Item的数量更新为0。
阅读全文