Anmelden

View Full Version : Problem SQL Summenbildung



Jenne
28-01-11, 12:32
Hallo Kollegen,

ich soll aus 3 Datei folgendes bilden:

Artikel_Datei :

Artikel-Nr 1
Artikel-Nr 2
Artikel-Nr 3

Lager_Datei :

Artikel-Nr 1, Lagerbestand
Artikel-Nr 2, Lagerbestand
Artikel-Nr 3, Lagerbestand


Abgangsdatei:

Artikel-Nr 1, Umsatz1
Artikel-Nr 1, Umsatz2
Artikel-Nr 1, Umsatz3
Artikel-Nr 2, Umsatz1
Artikel-Nr 2, Umsatz2
Artikel-Nr 2, Umsatz3
Artikel-Nr 3, Umsatz1
Artikel-Nr 3, Umsatz2
Artikel-Nr 3, Umsatz3

als Ergebnis sollte herauskommen:

Artikel-Nr 1, Lagerbestand, sum(aus abgangsdatei)
Artikel-Nr 2, Lagerbestand, sum(aus Abgangsdatei)
Artikel-Nr 3, Lagerbestand, sum(aus Abgangsdatei)

Ich bekomme das mit SQL nicht hin????

Hat einer von Euch eine Idee?

Danke im Voraus für Eure Hilfe
Gruß
Jenne

Xanas
28-01-11, 12:49
Gibt es in der Lager-Datei immer nur einen Satz pro Artikel?

Kannst Dein bisheriges Statement mal posten, dann kann man besser bei dem Problem helfen, oder hast Du generell Probleme das in SQL abzubilden?

Xanas

Pikachu
28-01-11, 13:02
Vielleicht so (aber ohne Gewähr).


SELECT A.ARTIKEL, B.BESTAND, SUM(U.UMSATZ)

FROM FILE1 AS A

LEFT OUTER JOIN FILE2 AS B ON A.ARTIKEL=B.ARTIKEL
LEFT OUTER JOIN FILE3 AS U ON A.ARTIKEL=U.ARTIKEL

GROUP BY A.ARTIKEL, B.BESTAND
ORDER BY A.ARTIKEL, B.BESTAND

Fuerchau
28-01-11, 13:39
Das Problem ist, dass der Lagerbestand nur 1 x pro Artikel, der Umsatz aber n x pro Artikel auftritt.
Du musst daher für den Bestand den Durchschnitt AVG(Lagerbestand) bilden.

select Artikel, avg(b.Lagerbestand), sum(c.Umsatz)
from Artikel a
left join Lager b on a.Artikel=b.Artikel
left join Umsatz c on a.Artikel=c.Artikel

Klarer wirds mit einer CTE:

with
xUms as (select Artikel, sum(Umsatz) as Umsatz from UmsatzDatei group by Artikel)
,
xLager as (select Artikel, sum(Bestand) as Bestand from Lager group by Artikel)

select Artikel, Bestand, Umsatz
from ArtikelDatei A
left join xLager b on a.Artikel=b.Artikel
left join xUmsatz c on a.Artikel=c.Artikel

rmittag
28-01-11, 13:39
ungefähr so:



with x as
( select ArtikelNr, coalesce(sum(Umsatz), 0) as Umsatz
from UmsatzDatei
group by ArtikelNr
)
select ...
from Artikel
join Bestand on ...
join x on ...

BenderD
28-01-11, 14:41
... mir gefällt in diesem Fall die Subselect Variante ganz gut:


select a.*, l.*, (select coalesce(sum(umsatz), 0)
from abgang g
where g.artikel = a.artikel) umsatz
from artikel a
left join lager l
on a.artikel = l.artikel

wenn es mehrere Sätze in Lager für einen artikel geben kann, muss man im äußeren Select pro Artikel gruppieren und aufsummieren. Kann es auch sein, dass kein Lagersatz da ist, empfiehlt sich über das Bestandsfeld eine coalesce Funktion, analog zu dem umsatfeld.

D*B

Jenne
31-01-11, 13:48
Danke an Alle,

mit dem join hat super funktioniert.


Gruß
Jenne