2

Ich versuche, einen Weg über eine SQL Server 2008 Datenbank durch eine Auftragsliste zu durchlaufen und offene Nachfrage für ein Teil zu erhalten, bestellen Sie nach Fälligkeitsdatum Sehen Sie sich dann eine Bestellungstabelle an und erfüllen Sie die Bestellungen nach Bestellung, und bestellen Sie die Bestellung ebenfalls bis zum Fälligkeitsdatum. Gleichzeitig muss ich zeigen, welche Bestellung (en) den Kundenauftrag erfüllen.So zeigen Sie Auftragserfüllung in einer SQL Server 2008-Abfrage

Zum Beispiel:

SO Tisch

SO#  DueDate  Part Number Required QTY 
--------------------------------------------- 
100  9/3/16  1012   2 
101  9/12/16  1012   1 
107  10/11/16 1012   4 
103  10/17/16 1012   7 

PO Tabelle:

PO#  DueDate  Part Number Ordered QTY 
-------------------------------------------- 
331  9/1/16  1012   1 
362  9/2/16  1012   1 
359  9/24/16  1012   5 
371  10/1/16  1012   3 
380  10/10/16 1012   10 

Mit diesen Daten würde Ich mag dieses Ergebnis sehen:

SO# DueDate  Part Number Required QTY PO number QTY Used QTY Remain 
-------------------------------------------------------------------------- 
100 9/3/16  1012   2    331   1   0 
100 9/3/16  1012   1    362   1   0 
101 9/12/16  1012   1    359   1   4 
107 10/11/16 1012   4    359   4   0 
103 10/17/16 1012   7    371   3   0 
103 10/17/16 1012   7    380   4   6 

Ich habe diesen Kundenauftragsabwicklungsprozess bereits durchgeführt, aber nicht bis zu dem Punkt, an dem die Bestellung (en) die Bestellung erfüllen, sondern nur bis zur Summe aller offenen Lieferungen, dann durchläuft und subtrahiert die Lieferung von jedem Kundenauftrag um ein laufendes Restguthaben zu bekommen.

Vielen Dank im Voraus für Ihre Hilfe.

+0

Die Logik für die Ausgabetabelle, insbesondere 'Menge Remain' ist nicht klar, . – Ash

+0

Wenn Sie eine Antwort wollen, schlage ich vor, dass Sie SQLFiddle.com verwenden, um ein Beispiel zu erstellen, mit dem wir spielen können. Der Ansatz, den ich verwenden würde, besteht darin, eine Abfrage zu schreiben, die die nächste "verbleibende" Bestellung in der Warteschlange auf den nächsten verbleibenden Auftrag in der Warteschlange anwendet, und diese Abfrage dann einfach erneut auszuführen, bis Sie keine SOs oder POs mehr haben. Sie benötigen eine Arbeits-Tabelle, die sowohl Tabellen erfasst und Arbeitsbeträge aufzeichnet, als auch eine andere Tabelle, um den endgültigen Betrag aufzuzeichnen. –

+0

@AshwinNair Alle Ausgaben 'QTY'-Spalten sind eine laufende Summe. Schauen Sie sich jede Zeile so an, als ob die Bestellung so viel von der SO erfüllt hat wie möglich, wir erfassen, wie viele Teile verwendet wurden und wie viele noch benötigt werden, wenn die Bestellung nicht genügend Teile enthält oder wie viele Teile in der Bestellung verbleiben Nicht alle von ihnen wurden benutzt. Die nächste Zeile ist dann entweder der Effekt der nächsten PO auf ein unvollständiges SO oder das nächste SO, wenn die aktuelle SO vollständig erfüllt ist. – iamdave

Antwort

1

Ich fand ein bisschen komisch Lösung, hoffe es hilft dir. Vielleicht später ich es optimieren konnte, aber jetzt habe ich es schreiben wie:

;WITH cte AS (
    SELECT 1 as l 
    UNION ALL 
    SELECT l+1 
    FROM cte 
    WHERE l <= 1000000 
), SO_cte AS (
    SELECT *, 
      ROW_NUMBER() OVER (ORDER BY DueDate ASC) as rn 
    FROM SO s 
    CROSS JOIN cte c 
    WHERE c.l <= s.[Required QTY] 
), PO_cte AS (
    SELECT *, 
      ROW_NUMBER() OVER (ORDER BY DueDate ASC) as rn 
    FROM PO p 
    CROSS JOIN cte c 
    WHERE c.l <= p.[Ordered QTY] 
), almost_done AS (
    SELECT DISTINCT  
      s.SO#, 
      s.DueDate, 
      s.[Part Number], 
      p.PO#, 
      s.[Required QTY], 
      p.[Ordered QTY] 
    FROM SO_cte s 
    LEFT JOIN PO_cte p 
     ON p.rn = s.rn 
), final AS (
    SELECT *, 
      ROW_NUMBER() OVER (ORDER BY DueDate) AS RN 
    FROM almost_done 
) 

SELECT f.SO#, 
     f.DueDate, 
     f.[Part Number], 
     f.[Required QTY], 
     f.PO#, 
     CASE WHEN f.[Ordered QTY]>f.[Required QTY] 
       THEN ISNULL(ABS(f1.[Required QTY]-f1.[Ordered QTY]),f.[Required QTY]) 
       ELSE f.[Ordered QTY] END 
         as [QTY Used], 
     f.[Ordered QTY] - 
     CASE WHEN f1.PO# = f.PO# 
       THEN f1.[Ordered QTY] 
       ELSE 
        CASE WHEN f.[Ordered QTY]>f.[Required QTY] 
          THEN ISNULL(ABS(f1.[Required QTY]-f1.[Ordered QTY]),f.[Required QTY]) 
          ELSE f.[Ordered QTY] END 
     END as [QTY Remain] 
FROM final f 
LEFT JOIN final f1 
    ON f.RN = f1.RN+ 1 
     AND (f.SO# = f1.SO# OR f.PO# = f1.PO#) 
OPTION(MAXRECURSION 0) 

Ausgang für Daten, die Sie zur Verfügung gestellt:

SO# DueDate  Part Number Required QTY PO# QTY Used QTY Remain 
100 2016-09-03 1012  2    331 1   0 
100 2016-09-03 1012  2    362 1   0 
101 2016-09-12 1012  1    359 1   4 
107 2016-10-11 1012  4    359 4   0 
103 2016-10-17 1012  7    371 3   0 
103 2016-10-17 1012  7    380 4   6 
Verwandte Themen