2016-07-14 5 views
1

Um produziert einige Datensätze aus dem Vormonat in der gleichen Zeile angezeigt werden, hatte ich meine Tabelle wie folgt zu sich selbst zu kommen:Selbst inkonsistenten Wert registrieren letzten Monat

SELECT 
     a.[periodOrderNum] 
     ,SUM(a.AktivNy) as ActiveNew 
     ,SUM(b.[AktivNy]) as ActiveNewPrevMonth 
    FROM myTable a 
    JOIN myTable b 
    ON a.customerSNKey = b.customerSNKey 
    AND a.periodOrderNum = b.periodOrderNum + 1 
    GROUP BY a.[periodOrderNum] 

In dem obigen Code periodOrderNum ist eine Auftragsnummer, die der Periode zugeordnet ist. Wenn z. B. die aktuelle Periode 5 ist, hat die vorherige Periode eine Bestellnummer von 4.

Und customerSNKey ist der Seriennummernschlüssel des Kunden, den ich als eine meiner JOIN Bedingungen verwende. Die andere Bedingung (a.periodOrderNum = b.periodOrderNum + 1) verwende ich, um den Wert der vorherigen Periode zu erhalten. Aber die Ergebnisse sind nicht konsistent. Wie weiter unten im Bild zu sehen, für die Auftragsnummer 280 ist der Wert von ActiveNewPrevMonth 20203, die nicht der ActiveNew Wert der Auftragsnummer 279.

enter image description here

Was bin ich in meinem beitreten falsch?

+1

Es ist schwer zu sagen, da alle Daten nicht angezeigt werden. Ich würde die Abfrage ohne den Join ausführen und "UND periodOrderNum = 280" haben, um zu sehen, was es SUM versucht, nur um sicherzustellen, dass. Könnten Sie diese Ergebnisse zu Ihrer Frage hinzufügen? –

+0

Machen Sie einige Daten und zeigen Sie DDL, Eingabe, Ausgabe und erwartete Ausgabe. Lies und handle auf [mcve]. PS Was ist, wenn es keine Daten für den vorherigen Monat gibt? – philipxy

Antwort

1

Ohne einige Beispieldaten kann ich nicht sagen, wo schief gelaufen ist. Aber so oder so, Ihre Anfrage hier wird sowieso einen falschen Wert zurückgeben, glaube ich. Sagen Sie, wenn Sie mehrere Reihen unter demselben periodOrderNum haben, ist Ihr ActiveNew Wert ziemlich garantiert übertrieben. Versuchen Sie, sie in Unterabfragen wie diese zu trennen:

SELECT a.[periodOrderNum] 
,a.ActiveNew 
,b.ActiveNewPrevMonth 
FROM 
(
SELECT 
customerSNKey, [periodOrderNum] 
,SUM(AktivNy) as ActiveNew 
FROM myTable 
GROUP BY customerSNKey, [periodOrderNum] 
) AS a 
INNER JOIN 
(
SELECT 
customerSNKey, [periodOrderNum] + 1 as [periodOrderNum] 
,SUM(AktivNy) as ActiveNewPrevMonth 
FROM myTable 
GROUP BY customerSNKey, [periodOrderNum] + 1 
) AS b 
ON a.customerSNKey = b.customerSNKey 
AND a.[periodOrderNum] = b.[periodOrderNum] 
+0

Entschuldigung. Habe keinen Zugang zum db atm. Ich werde mich so schnell wie möglich bei Ihnen melden. – Disasterkid

+0

Hallo und Entschuldigung für die lange Verzögerung. Ihre Abfrage gibt mir nur 0s und 1s als 'ActiveNew' und' ActiveNewPrevMonth'. Ich wünschte, ich könnte Ihnen mit einigen Beispieldaten helfen, aber leider darf ich das nicht. – Disasterkid

Verwandte Themen