一库存表,同一商品A可能有不同批次的进货,在出库时先进货的先出库。示例表如下(进货批次越小进货越早)商品名称 数量 进货批次
AAA 10 1
AAA 10 2
AAA 10 3假设商品AAA出库5个,则记录应是以下商品名称 数量 进货批次
AAA 5 1
AAA 10 2
AAA 10 3假设商品AAA出库12个,则记录应是以下商品名称 数量 进货批次
AAA 0 1
AAA 8 2
AAA 10 3假设商品AAA出库26个,则记录应是以下商品名称 数量 进货批次
AAA 0 1
AAA 0 2
AAA 4 3就是类似于上边示例中的数据,我现在解决方案比较麻烦,把某一商品的库存全部查询出来,然后递归,根据出库数量和库存数量计算出这些记录该扣掉多少数字或者不扣数字,然后再UPDATE这些记录。请问有没有一个方便点的解决方案或者一条SQL语句能解决的?谢谢了。
AAA 10 1
AAA 10 2
AAA 10 3假设商品AAA出库5个,则记录应是以下商品名称 数量 进货批次
AAA 5 1
AAA 10 2
AAA 10 3假设商品AAA出库12个,则记录应是以下商品名称 数量 进货批次
AAA 0 1
AAA 8 2
AAA 10 3假设商品AAA出库26个,则记录应是以下商品名称 数量 进货批次
AAA 0 1
AAA 0 2
AAA 4 3就是类似于上边示例中的数据,我现在解决方案比较麻烦,把某一商品的库存全部查询出来,然后递归,根据出库数量和库存数量计算出这些记录该扣掉多少数字或者不扣数字,然后再UPDATE这些记录。请问有没有一个方便点的解决方案或者一条SQL语句能解决的?谢谢了。
$ar_result = array(
10001 => 10, //假设10001为记录id,10为数量
10002 => 10,
10003 => 10
);//计算出库,这里未考虑出库数量大于库存数量的情况
function deliver($amount, $ar_result) {
$ar = array();
foreach($ar_result as $k => $v) {
if ($amount > 0) {
if ($amount < $v) {
$ar[$k] = $v - $amount;
break;
}
else {
$ar[$k] = 0;
$amount -= $v;
}
}
}
return $ar;
}//根据计算结果构造UPDATE语句
$ar = deliver(26, $ar_result);
/*
Array
(
[10001] => 0
[10002] => 0
[10003] => 4
)
*/
set @x=14;
update inv
set num=if(@x>=num, 0, num-@x) + (@x:=if(@x>=num, @x-num, 0 ) )*0
where name='a'
order by seq
;