PDA

View Full Version : SQL Mengensummen eines Artikels vom aktuellsten Datum



Harry72
15-09-14, 12:26
Hallo zusammen!

Ich habe hier eine riesige Lagerbewegungsdatei und bräuchte jeweils die Summe der bewegten Mengen des jeweiligen Artikels vom aktuellsten Buchungsdatum.



<tbody>
Artikel-Nr
Datum
Menge


500023
09.09.2014
20000


500023
09.09.2014
3750


500023
07.05.2014
1200


500011
08.09.2014
200


500011
07.04.2014
4000


500011
03.03.2014
2500

</tbody>

Das Ergebnis sollte dann so aussehen:



<tbody>
Artikel-Nr
Datum
Menge


500023
09.09.2014
23750


500011
08.09.2014
200

</tbody>


So bald ich mit MAX und SUM-Argumenten gleichzeitig arbeite, bekomme ich immer die Summe aller Mengen, unabhängig vom aktuellsten Datum. Im Fall von Artikel 500023 vom 09.09.2014 erhalte ich also 24950.

Mein Denkansatz ist dabei folgendermaßen:
SELECT Artikel-Nr, MAX(Datum), SUM(Menge) FROM Tabelle
GROUP BY Artikel-Nr

Was mache ich dabei falsch?

Gruß, Harry72

Fuerchau
15-09-14, 12:44
Du bekommst eben das was da steht, Summe je Artikel und das letzte Datum.
Hier musst du einschränken:

Select a.Artikel, max(a.Datum), sum(a.Menge) from Tabelle a
inner join (select Artikel, max(Datum) as Datum from Tabelle b Group by Artikel) b on a.Datum=b.Datum
Group by a.Artikel

Harry72
15-09-14, 15:41
Funktioniert leider nicht so wie erhofft.
Wenn ich wie vorgeschlagen im on "b.Datum" schreibe, dann erscheint folgender Fehler:
Spalte Datum nicht in Tabelle B in *N.

Daraufhin hab ich das b. vor dem Feld Datum entfernt.
Der SQL sieht jetzt so aus:

SELECT A.Artikel-Nr, max(a.Datum), SUM(a.Menge)
FROM Tabelle A
INNER JOIN
(SELECT Artikel-Nr, MAX(Datum) AS Datum from Tabelle b
GROUP BY Artikel-Nr)
B ON A.Datum=Datum and
a.Artikel-Nr = b.Artikel-Nr
WHERE A.Artikel-Nr = '500023'
GROUP BY A.Artikel-Nr
order by a.Artikel-Nr


Leider erhalte ich jetzt wieder die Summe des Feldes Menge aller Datensätze von 500023.
Ich möchte aber nur die Summe der Datensätze Menge mit dem höchsten Datum.

B.Hauser
15-09-14, 16:13
Das SQL-Statement muss wie folgt aussehen:


With x as (Select ArtikelNr, Max(Datum) Datum
from Tabelle
Group By ArtikelNr)
Select x.ArtikelNr, x.Datum, Sum(Menge)
From x join Tabelle a on x.ArtikelNr = a.ArtikelNr
and x.Datum = a.Datum
Group By x.ArtikelNr, x.Datum

oder


Select x.ArtikelNr, x.Datum, Sum(Menge)
From (Select ArtikelNr, Max(Datum) Datum
From Tabelle
Group By ArtikelNr) x
Join Tabelle a on x.ArtikelNr = a.ArtikelNr
and x.Datum = a.Datum)
Group By x.ArtikelNr, x.Datum


Birgitta

Fuerchau
15-09-14, 16:29
@Birgitta
Das stimmt so nicht. Es muss ein "Inner Join" her, damit die Einschränkung auf das letzte Datum passiert. Ohne "inner" wird ein Left join daraus und ich erhalte auch die Summen der anderen Daten und nicht nur des letzten Datums.

Ein Endgruppierung auf das Datum ist nicht erforderlich. Ein Group by Datum oder max(Datum) muss das selbe Ergebnis bringen.

Bei meinem obigen Beispiel fehlt nur der " on a.artikel = b.artikel and ...".
Wir machen das schon häufiger so.


Der SQL

SELECT
A.Artikel-Nr,
max(a.Datum),
SUM(a.Menge)

FROM Tabelle A

INNER JOIN

(SELECT
Artikel-Nr,
MAX(Datum) AS Datum
from Tabelle b
GROUP BY Artikel-Nr) B
ON A.Datum = B.Datum
and a.Artikel-Nr = b.Artikel-Nr

WHERE A.Artikel-Nr = '500023'

GROUP BY A.Artikel-Nr
order by a.Artikel-Nr

sollte eigentlich richtig sein.

Fuerchau
15-09-14, 16:32
@Birgitta
OK, ich nehm's zurück.
Anders herum geht's natürlich auch.

B.Hauser
15-09-14, 16:42
Nur zur Info: INNER JOIN und JOIN ist das Gleiche!
Das kannst Du auch gerne in der SQL Referenz nachlesen:
"If a join operator is not specified, INNER is implicit."
Für einen LEFT JOIN muss LEFT explizit angegeben werden.

Meine beiden Statements waren absolut korrekt.
Ich hab' auch schon das eine oder andere SQL-Statement abgesetzt und außerdem probiere ich meine Statements i.d.R. aus bevor ich sie poste.

Birgitta