2016-05-23 2 views
0

В настоящее время я пытаюсь получить конкретное значение с помощью SQL-запроса на основе условия суммы.SQL-запрос - результат сопоставления первого значения

Идея состоит в том, что для сокращения времени доставки требуется конкретный минимальный уровень продукта. В примере это значение будет «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

Вы можете сделать это с помощью встроенных переменных и некоторых подзапросов к:

  • порядок записей по видам продукции, а затем номер предварительного заказа;
  • добавлять значения для суммарной суммы, сбрасывая ее, когда запись имеет другую ссылку на продукт, и устанавливает значение boolean в 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

Это ответ на ваш вопрос вопрос? – trincot

+0

Не могли бы вы сообщить мне, было ли это вам полезно? – trincot

Смежные вопросы