基于MySQL查询中的输入/先前结果计算而不使用SET / SP

时间:2016-06-01 07:28:50

标签: mysql sql

我有一个stock表,我想做一些计算,以获得具有适当数量的符合条件的库存行。

Stock

-----------------------------------------------------------------
| id |     item    | batch_number | expiry_date | current_stock | 
-----------------------------------------------------------------
   1         1         BAT-1-1      15 Jun 2016              10
   2         1         BAT-1-2      20 Jun 2016               5
-----------------------------------------------------------------

我的输入为item = 1& quantity = 13

我的预期查询输出

----------------------------------------------------------------------------
| id |     item    | batch_number | expiry_date | current_stock | eligible |
----------------------------------------------------------------------------
   1         1         BAT-1-1      15 Jun 2016              10         10
   2         1         BAT-1-2      20 Jun 2016               5          3
----------------------------------------------------------------------------

逻辑:

1)最近的有效期是首选

2)如果current_stock >= input - > eligible = input,其他为eligible = current_stock,并将输入减少为input -= eligible

3)在下一个最近的到期日期使用除去的输入值重复步骤2,直到我没有更多行要处理或我已经有足够的符合条件的数量。

是否可以在没有使用SP或SET的情况下进行mysql查询? Bcoz我将在Java应用程序中实现结果查询。我正在使用Hibernate,所以我可以将查询作为sql或hql或条件执行(如果可能的话)。

我已经为上述逻辑编写了一个查询但没有递减输入值以进行进一步的计算

SELECT
    id
    item,
    batch_number,
    expiry_date,
    current_stock,
    CASE WHEN current_stock >= 13 THEN 13 ELSE current_stock END AS eligible
FROM
    stock
WHERE
    item = 1
ORDER BY
    expiry_date

但它不会为第二行产生eligible = 3因为我在第一行计算后没有递减输入值。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我还没有喝咖啡,所以我的算术可能有些偏差,但这样的事情应该有用......

SELECT x.*
     , GREATEST(@i,MOD(current_stock,@i)) eligible
     , @i:=GREATEST(@i-current_stock,0) i 
  FROM stock x
     , (SELECT @i:=13) vars 
 ORDER  
    BY expiry_date;