Frage

Ich versuche, meinen Kopf um diese heute Morgen zu wickeln.

Ich versuche inventory Status für Teile zu zeigen (für unsere Produkte) und diese Abfrage wird nur komplex, wenn ich versuche, alle Teile zurück.

Lassen Sie es mich auslegen:

  • einzelne Tabelle inventoryReport
  • Ich habe eine eindeutige Liste von X Teilen I angezeigt werden soll, das Ergebnis der X Anzahl der Zeilen (1 Zeile pro Teil neuestes Inventar Eintrag angezeigt) sein muss.
  • Tisch ist aus datiert Einträgen von Bestandsveränderungen aus (so dass ich nur den LATEST Datumseintrag pro Teil benötigen).
  • alle in dieser einzigen Tabelle enthaltenen Daten, so dass keine Verknüpfungen notwendig.

Derzeit für 1 Einzelteil, ist es ziemlich einfach ist, und ich kann dies erreichen, indem Sie die folgende SQL tun (Ihnen eine Vorstellung geben):

SELECT     TOP (1) ldDate, ptProdLine, inPart, inSite, inAbc, ptUm, inQtyOh + inQtyNonet AS in_qty_oh, inQtyAvail, inQtyNonet, ldCustConsignQty, inSuppConsignQty
FROM         inventoryReport
WHERE     (ldPart = 'ABC123')
ORDER BY ldDate DESC

, die mir meine TOP 1 Reihe bekommt, so einfach pro Teil, jedoch muss ich alle X zeigen (lässt 30 Teile sagen). Also muss ich 30 Zeilen, mit diesem Ergebnis. Natürlich würde die einfache Lösung Schleife X Anzahl der SQL-Aufrufe in meinem Code (aber es wäre teuer) und das würde ausreichen, aber für diesen Zweck würde ich lieben diese SQL etwas mehr zu arbeiten, um die x # Anrufe an die DB zurück zu reduzieren (falls erforderlich) auf nur 1 Abfrage.

Von dem, was ich hier sehe, kann ich den Überblick über den jeweils neuesten Termin pro Stück halten müssen irgendwie während für meine Ergebnismenge suchen.

Ich würde letztlich tun, um ein

WHERE ldPart in ('ABC123', 'BFD21', 'AA123', etc)

, um die Teile zu begrenzen, was ich brauche. Hoffentlich habe ich meine Frage klar genug. Lassen Sie uns wissen, wenn Sie eine Idee haben. Ich kann keine DISTINCT tun, wie die Zeilen nicht die gleichen sind, wird das Datum Bedürfnisse der neuesten sein, und ich brauche ein Maximum von X Zeilen.

Die Gedanken? Ich bin fest ...

War es hilfreich?

Lösung

Bearbeiten : Stellen Sie sicher, dass die Leistung jeder Lösung zu testen. Wie bereits ausgeführt in diese Frage kann die CTE-Methode ROW_NUMBER entwickeln.

;with cteMaxDate as (
    select ldPart, max(ldDate) as MaxDate
        from inventoryReport
        group by ldPart
)
SELECT md.MaxDate, ir.ptProdLine, ir.inPart, ir.inSite, ir.inAbc, ir.ptUm, ir.inQtyOh + ir.inQtyNonet AS in_qty_oh, ir.inQtyAvail, ir.inQtyNonet, ir.ldCustConsignQty, ir.inSuppConsignQty
    FROM cteMaxDate md
        INNER JOIN inventoryReport ir
            on md.ldPart = ir.ldPart
                and md.MaxDate = ir.ldDate

Andere Tipps

  SELECT *
  FROM   (SELECT i.*,
      ROW_NUMBER() OVER(PARTITION BY ldPart ORDER BY ldDate DESC) r
      FROM   inventoryReport i
      WHERE  ldPart in ('ABC123', 'BFD21', 'AA123', etc)
         )
  WHERE  r = 1

Sie müssen sich in einem Sub-Abfrage beitreten:

SELECT i.ldPart, x.LastDate, i.inAbc
FROM inventoryReport i
INNER JOIN (Select ldPart, Max(ldDate) As LastDate FROM inventoryReport GROUP BY ldPart) x
on i.ldPart = x.ldPart and i.ldDate = x.LastDate
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top