【问题标题】:How to accommodate the boxes quantity in the available boxes如何容纳可用盒子中的盒子数量
【发布时间】:2021-08-27 07:49:51
【问题描述】:

我在数据库中针对每个硬件和盒子定义了盒子数量

CREATE TEMPORARY TABLE IF NOT EXISTS temp_Boxes (HWID  int, BoxId int, Quantity int);
INSERT temp_Boxes VALUES
--  (5, 1, 1),
--  (5, 1, 2),
    (5, 1, 3),    
    (5, 2, 6),    
--  (8, 1, 0),    
    (8, 2, 1);

现在我将有一个带有hardwareIdquantity 的参数,需要容纳在那个框中让我们说:

set @hardwareId = 5;
set @quantity = 9; -- quantity could be any whole number

所以我在这里感到困惑,如何使用简单的 SQL 查询来实现以下结果,该查询将返回此结果:

(5, 1, 3),    
(5, 2, 6)

到目前为止我尝试过的或者可以说我脑海中的预置代码就像是在数量上运行循环,而在内部循环中运行在盒子计数上的迭代

WHILE @quantity > 0 DO
   
    SELECT 
    *,
    @quantity quanvalbefore ,
        Case when qty >= @quantity Then @quantity ELSE @quantity := @quantity-qty END remain,
    @quantity quanvalAfter  
            FROM  temp_Boxes
            where HWID = @hardwareId
            ;
END WHILE;

对此问题的任何建议或解决方案都会有所帮助,因为我无法弄清楚我将如何处理剩余的 3 个项目,其中 6 个已分配

【问题讨论】:

  • 我认为您可能需要诉诸蛮力。
  • 这听起来像是一个装箱问题,基本上需要蛮力方法来获得最佳解决方案。例如,为什么不能在 1/2/6 之前给出答案?
  • @asad 每个 HWID 的最大行数是多少?如果它非常小,比如 8-10,那么蛮力是可能的/有点实用。
  • @SalmanA 它可以是任何数字,但可以猜测它不会超过 10

标签: mysql sql logic


【解决方案1】:

您可以创建另一个临时表来存储计划的减法。您可以保留您拥有的while 循环,并从此临时表中插入新的临时表,在每次迭代时将硬件 id 存储到一个变量中,以便您知道您所在的行,从中减去该值数量(如果结果为负,则将其更改为空)。将临时表中的记录副本插入新临时表后,从临时表中减去该值。

我没有为这个写代码,因为我没有时间,所以,如果你需要我为你写一些代码,那么请用测试用例和表格创建一些 SQL fiddle 并与我分享。

【讨论】:

【解决方案2】:

我能够解决它并稍微修改原始架构。谢谢大家的帮助。

Solution

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多