2016-05-23 96 views
0

我目前正试图通过基于总和条件的sql查询来获取特定值。SQL查询 - 第一个值匹配的总和结果

这个想法是,我需要一个产品的特定minimum_qty来减少其交货时间。在这个例子中,值将是“2”。这个想法是查询总结了pop_supplied_qty列,直到它>> minimum_qty。

查询结果应该是pop_order_num,该条件首先满足(653)。

当前查询看起来是这样的:

CASE 
    WHEN (sum(pop.pop_qty) - sum(pop.pop_supplied_qty)) >= minimum_qty 
     THEN MIN(pop.pop_order_num) 
    END AS pre_order_dt 

表: enter image description here

感谢您的输入!

回答

0

您可以通过在线变量和一些子查询做到这一点:

  • 为了通过产品的记录,然后预购数量;
  • 为累计总和添加值,当记录具有不同的产品参考时将其重置,并在总和超过最小阈值时将布尔值设置为true;
  • 筛选累计数量标记为已超过最小阈值的记录。

我已经假定minimum_qty存储在product表:

select product_id, 
     minimum_qty, 
     pop_order_num, 
     cumul_qty 
from (
     select @newqty := if(@p = product_id, @qty, 0) + qty, 
      (@qty < minimum_qty and @newqty >= minimum_qty) filter, 
      @p := product_id as product_id, 
      minimum_qty, 
      pop_order_num, 
      @qty := @newqty as cumul_qty 
     from (
      select pop.product_id, 
        pop.pop_order_num, 
        pop.pop_qty - pop.pop_supplied_qty as qty, 
        p.minimum_qty 
      from  pre_order_dt pop 
      inner join product p on p.product_id = pop.product_id 
      order by product_id, 
        pop_order_num 
      limit 10000000000 
      ) as base, 
      (select @qty := 0) as init 
    ) as extend 
where filter 

SQL fiddle

请注意,limit子句只是一个预防措施,因为MySql引擎不必遵守order by,因为它发生在内部查询中。通过添加limit子句(它应该指定非常高的值,以便它实际上不会遗漏任何记录),MySql将在处理这个内部查询被包裹进来的查询之前被强制应用order by

+0

Did this answer your题? – trincot

+0

你能告诉我这是否对你有用吗? – trincot