2016-10-21 2 views
1

Vielen Dank im Voraus für das Lesen!T-SQL JOIN-Tabelle auf der Basis des nächsten Datums

Die Frage, die ich beantworten möchte, lautet: "Wie viel kosten Teile wirklich?" Wir fertigen durch die Bearbeitung von Rohmetall-Knüppeln bis hin zu Metallteilen. Endgültige Teile werden an einen Kunden verkauft und Altmetall aus dem Prozess wird an den Schrottplatz verkauft.

Aus Gründen der Geschäfts-/ERP-Konfiguration wird unser Schrottanbieter als Kunde aufgeführt, und wir liefern ihm Teile wie unsere anderen Kunden. Diese Dummy-Teile sind einfach für jede der Metalllegierungen, mit denen wir arbeiten, so dass es für jede verwendete Legierung einen Dummy-Schrottteil gibt. Die Schrottsendungen werden immer dann ausgeführt, wenn wir unsere Schrottbehälter füllen, so dass es kein definiertes Zeitintervall gibt.

Ich versuche, das Lieferdatum eines realen Teils an einen realen Kunden mit dem nächsten Schrottdatum der gleichen Legierung zu verbinden. Dann kann ich den Schrottwert pro Pfund, für das wir bezahlt wurden, erfassen und in unseren Umsatz für die Teile, die wir herstellen, einbeziehen. Wenn ich nach der Welt fragen kann, wäre es hilfreich zu wissen, wie man die Schrottsendung unmittelbar vor oder unmittelbar nach der Lieferung eines realen Teils ergreift - ich bin sicher, das Management wird ihre Meinung mehrere Male ändern, wenn sie darüber diskutieren wollen. vor 'oder' nach 'Nummer.

Ich habe andere Lösungen ausprobiert und kann sie nicht zur Arbeit bringen. Ich weine Onkel, ich kann es einfach nicht zur Arbeit bringen .... die Web-SQL-Schnittstelle, die unser ERP verwendet, behauptet, es sei T-SQL ... Danke, dass Sie so weit gelesen haben!

Was ich die Ausgabe aussehen möchte ist:

Customer Part  Price Alloy Weight_Lost Scrap_Value Ship_Date 
ABC  Widget1 99.99 C182 63   2.45   10-01-2016 

Hier ist die einfachste, das ich die Tabellen nach unten kochen kann:

SELECT 
    tbl_Regular_Sales.Customer 
    tbl_Regular_Sales.Part 
    tbl_Regular_Sales.Price 
    tbl_Regular_Sales.Alloy 
    tbl_Regular_Sales.Weight_Lost 
    tbl_Scrap_Sales.Price AS 'Scrap_Value' 
    tbl_Regular_Sales.Ship_Date 
    FROM 
    (SELECT P.Part 
      ,P.Alloy 
      ,P.Price 
      ,S.Ship_Date 
      ,S.Customer 
    FROM Part AS P 
    JOIN S AS S 
    ON  S.Part_Key = P.Part_Key 
    WHERE Shipper.Customer = 'Scrap_Yard' 
    ) AS tbl_Scrap_Sales 
    JOIN 
     (SELECT P.Part 
       ,P.Weight_Lost 
       ,P.Alloy 
       ,P.Price 
       ,S.Ship_Date 
       ,S.Customer 
     FROM Part AS P 
     JOIN S AS S 
     ON  S.Part_Key = P.Part_Key 
     WHERE Shipper.Customer <> 'Scrap_Yard') AS tbl_Regular_Sales 
    ON 
    tbl_Regular_Sales.Alloy = tbl_Scrap_Sales.Alloy 
    AND <Some kind of date JOIN to get the closest scrap shipment value> 
+0

Ich benutze dieses Muster sehr. Du willst etwas wie 'where date_col <= (wähle max (date_col) aus tbl wo ...)' –

Antwort

1

So etwas wie dies den Trick tun kann:

WITH cteScrapSales AS (
    SELECT 
     P.Alloy 
     ,P.Price 
     ,S.Ship_Date 
    FROM Part AS P 
    JOIN Shipper AS S ON S.Part_Key = P.Part_Key 
    WHERE S.Customer = 'Scrap_Yard' 
), cteRegularSales AS (
    SELECT 
     P.Part_Key 
     ,P.Part 
     ,P.Weight_Lost 
     ,P.Alloy 
     ,P.Price 
     ,S.Ship_Date 
     ,S.Customer 
    FROM Part AS P 
    JOIN Shipper AS S ON S.Part_Key = P.Part_Key 
    WHERE S.Customer <> 'Scrap_Yard' 
) 
SELECT 
     C.Customer 
     ,C.Part 
     ,C.Price 
     ,C.Alloy 
     ,C.Weight_Lost 
     ,C.Scrap_Value 
     ,C.Ship_Date 
    FROM (
     SELECT R.*, S.Price AS Scrap_Value, ROW_NUMBER() OVER (PARTITION BY R.Part_Key ORDER BY DATEDIFF(SECOND, R.Ship_Date, S.Ship_Date)) ix 
     FROM cteRegularSales R 
     JOIN cteScrapSales S ON S.Allow = R.Allow AND S.Ship_Date > R.Ship_Date 
    ) AS C 
    WHERE C.ix = 1; 
+0

es hat funktioniert, danke ~! Ich bin neugierig, was ist die kritische Operation oder Operationen hier? Ich werde die Dokumentation lesen und Sie nicht dazu bringen, sie zu erklären, aber ich bin sehr beeindruckt. – SDS

+0

Fensterfunktionen sind das mächtige Werkzeug bei der Arbeit ... sie ermöglichen es Ihnen, Werte basierend auf einer Teilung von Zeilen zu berechnen. https://www.simple-talk.com/sql/t-sql-programming/window-functions-in-sql/ - im Grunde der JOIN macht einen Cross-Join pro Versandteil mit allen Schrott geliefert später, dann berechnet die Fensterfunktion ein Rang basierend auf der Datumsdifferenz, der dann verwendet wird, um alle querverbundenen Reihen des versendeten Teils herauszufiltern, mit Ausnahme desjenigen mit der nächsten Zeitdifferenz. – Lucero

+0

Ich habe gerade einen Fehler gefunden - im Grunde für jede Lieferung an einen Kunden möchte ich das nächste Schrottdatum von dieser Lieferung haben. \ Wenn ich die Abfrage ab dem 01.01.2016 bis heute durchführe, stammen die Schrottwerte aus Schrottlieferungen, die in 10/2016 aufgetreten sind. Jan-Sendungen sollten Abfallsätze (Preis) ab diesem Zeitpunkt usw. abholen. Die Abfrage sollte die relevanten Ausschussraten für diese bestimmte Sendung abrufen, nicht nur die Raten, die dem in der Abfrage definierten Enddatum am nächsten sind. – SDS

Verwandte Themen