2016-05-23 13 views
0

Ich versuche derzeit, einen bestimmten Wert über eine SQL-Abfrage basierend auf einer Summenbedingung zu erhalten.SQL-Abfrage - erste Wert übereinstimmende Summe Ergebnis

Die Idee ist, dass ich ein bestimmtes minimum_qty eines Produktes benötige, um seine Lieferfrist zu verringern. Im Beispiel wäre dieser Wert "2". Die Idee ist, dass die Abfrage die Spalte pop_supplied_qty bis zu ihrem> = Minimum_qty zusammenfasst.

Das Abfrageergebnis sollte der pop_order_num sein, in dem diese Bedingung zuerst erfüllt wird (653).

Die aktuelle Abfrage sieht wie folgt aus:

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

Tabelle: enter image description here

Vielen Dank für Ihre Eingabe!

Antwort

0

Sie können dies tun, mit Inline-Variablen und einige Unterabfragen:

  • um die Aufzeichnungen von Produkt und dann vorbestellen Nummer;
  • Werte für die kumulative Summe addieren, zurücksetzen, wenn ein Datensatz eine andere Produktreferenz hat, und einen Booleschen Wert auf wahr setzen, wenn die Summe den Mindestschwellwert überschreitet;
  • Filter für die Datensätze, bei denen die kumulative Menge so markiert wurde, dass sie die Mindestschwelle überschritten hat.
    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

    :

Ich habe angenommen, dass die minimum_qty in einer product Tabelle gespeichert ist.

Beachten Sie, dass die Klausel limit nur eine Vorsichtsmaßnahme ist, da die MySql-Engine nicht die order by gehorchen muss, da es in einer inneren Abfrage auftritt. Durch Hinzufügen der limit-Klausel (die einen sehr hohen Wert angeben sollte, damit kein Datensatz ausgelassen wird), wird MySql gezwungen, das order by vor Verarbeitung der Abfragen anzuwenden, in denen diese innere Abfrage eingewickelt ist.

+0

Hat dies Ihre Antwort? Frage? – trincot

+0

Kannst du mich wissen lassen, ob dir das nützlich ist? – trincot

Verwandte Themen