My SQl Abfrage, 2 tabellen vergleichen und auswerten
Hallo,
lange als Gast oft über google zu euch gekommen und oft schon hilfe bekommen, aber nun meld ich mich doch mal an um persönlich eine Frage zum sql syntax loswerden zu können und hoffentlich hilfe zu bekommen...
Meine Datenbank:
Tabelle: ARTIKEL
EAN, Artikel_Nr, Artikel_Bezeichnung, Bestand
Tabelle: Inventur
EAN , Menge
Meine bis jetzt funktionierende abfrage die kuckt, welche artikel NICHT in Inventur gescannt wurden, aber prinzipiell in artikel db vorhanden sind UND welche Artikel in inventur gescannt mit einer kleineren menge als in der artikelverwaltung verfügbar sein müssten. Das klappt soweit...
SELECT Artikel.EAN, Artikel.Artikel_Nr,Artikel.Artikel_bezeichnung, Artikel.Bestand,Inventur.Menge as gezählt, (Artikel.Bestand-Inventur.Menge )as Fehlbestand FROM Artikel left JOIN Inventur on Inventur.ean = Artikel.ean where Inventur.ean is null or Artikel.Bestand > Inventur.Menge
... ABER:
Es kann vorkommen, dass ein Artikel in der Inventur z.B. mit einer Menge 5 gescannt wurde und wenig später NOCHMAL mit einer anderen menge gescannt wurde, weil er noch wo anders im regal steht, etc.
jetzt ist der stand, dass wenn der artikel gesamtmenge in artikel lager mit 10 hat, und er bei inventur 2 mal gescannt wird mit einmal menge 8 und dann nochmal mit menge 2, dass er trotzdem als nicht genug (also weniger als menge 10 ) ausgespuckt wird, da die beiden datensätze mit der gleichen ean in der inventur tabelle nicht summiert, sondern getrennt von einander ausgewertet werden.
nun versuche ich die abfrage so umzubiegen, dass ich eine sum(inventur.menge) mit reinbringe in die abfrage, aber das klappt ganz und gar nicht und man bekommt z.b. Fehler mit group by, usw.
für mich ist das echt tricky und hoffe auf hilfe
Danke im voraus!!!
lange als Gast oft über google zu euch gekommen und oft schon hilfe bekommen, aber nun meld ich mich doch mal an um persönlich eine Frage zum sql syntax loswerden zu können und hoffentlich hilfe zu bekommen...
Meine Datenbank:
Tabelle: ARTIKEL
EAN, Artikel_Nr, Artikel_Bezeichnung, Bestand
Tabelle: Inventur
EAN , Menge
Meine bis jetzt funktionierende abfrage die kuckt, welche artikel NICHT in Inventur gescannt wurden, aber prinzipiell in artikel db vorhanden sind UND welche Artikel in inventur gescannt mit einer kleineren menge als in der artikelverwaltung verfügbar sein müssten. Das klappt soweit...
SELECT Artikel.EAN, Artikel.Artikel_Nr,Artikel.Artikel_bezeichnung, Artikel.Bestand,Inventur.Menge as gezählt, (Artikel.Bestand-Inventur.Menge )as Fehlbestand FROM Artikel left JOIN Inventur on Inventur.ean = Artikel.ean where Inventur.ean is null or Artikel.Bestand > Inventur.Menge
... ABER:
Es kann vorkommen, dass ein Artikel in der Inventur z.B. mit einer Menge 5 gescannt wurde und wenig später NOCHMAL mit einer anderen menge gescannt wurde, weil er noch wo anders im regal steht, etc.
jetzt ist der stand, dass wenn der artikel gesamtmenge in artikel lager mit 10 hat, und er bei inventur 2 mal gescannt wird mit einmal menge 8 und dann nochmal mit menge 2, dass er trotzdem als nicht genug (also weniger als menge 10 ) ausgespuckt wird, da die beiden datensätze mit der gleichen ean in der inventur tabelle nicht summiert, sondern getrennt von einander ausgewertet werden.
nun versuche ich die abfrage so umzubiegen, dass ich eine sum(inventur.menge) mit reinbringe in die abfrage, aber das klappt ganz und gar nicht und man bekommt z.b. Fehler mit group by, usw.
für mich ist das echt tricky und hoffe auf hilfe
Danke im voraus!!!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 177478
Url: https://administrator.de/forum/my-sql-abfrage-2-tabellen-vergleichen-und-auswerten-177478.html
Ausgedruckt am: 22.02.2025 um 09:02 Uhr
12 Kommentare
Neuester Kommentar
Hallo boesi666,
SELECT Artikel.EAN, Artikel.Artikel_Nr,Artikel.Artikel_bezeichnung, Artikel.Bestand as Lagerbestand,(select sum(Inventur.Menge) from Inventur where inventur.ean=artikel.ean) as gezählt
group by Artikel.EAN, Artikel.Artikel_Nr,Artikel.Artikel_bezeichnung, Artikel.Bestand
having artikel.bestand >(select sum(Inventur.Menge) from Inventur where inventur.ean=artikel.ean)
Es geht sicherlich noch eleganter.
grüße vom it-frosch
SELECT Artikel.EAN, Artikel.Artikel_Nr,Artikel.Artikel_bezeichnung, Artikel.Bestand as Lagerbestand,(select sum(Inventur.Menge) from Inventur where inventur.ean=artikel.ean) as gezählt
group by Artikel.EAN, Artikel.Artikel_Nr,Artikel.Artikel_bezeichnung, Artikel.Bestand
having artikel.bestand >(select sum(Inventur.Menge) from Inventur where inventur.ean=artikel.ean)
Es geht sicherlich noch eleganter.
grüße vom it-frosch
Moin boesi666,
willkommen im Forum.
Ungetestet würde ich auf anderem Weg als it-frosch vorschlagen
- oder so, dass ich es lesen kann -
Grüße
Biber
willkommen im Forum.
Ungetestet würde ich auf anderem Weg als it-frosch vorschlagen
SELECT Artikel.EAN
, Artikel.Artikel_Nr
, Artikel.Artikel_bezeichnung
, Artikel.Bestand
, Inventur.Menge as gezählt
, (Artikel.Bestand-Inventur.Menge )as Fehlbestand
FROM Artikel left JOIN (select ean, Sum(menge) from Inventur group by ean from Inventur) Inventur
on Inventur.ean = Artikel.ean
where Inventur.ean is null or Artikel.Bestand > Inventur.Menge
- oder so, dass ich es lesen kann -
SELECT a.EAN
, a.Artikel_Nr
, a.Artikel_bezeichnung
, a.Bestand
, i.Menge as gezählt
, (a.Bestand - i.Menge ) as Fehlbestand
FROM Artikel a left JOIN (select ean, Sum(menge) from Inventur group by ean) i
on i.ean = a.ean
where i.ean is null or a.Bestand > i.Menge
Grüße
Biber
Moin boesi666,
sorry, mein Fehler.
Woher soll irgendein hergelaufener Parser ( oder eine streunende Parserin) auch das Feld "Menge" in der Tabelle "i" kennen?
Ich Dussel hab die Pseudo-Tabelle i ja definiert mit "SELECT Inventur.ean, Sum( Inventur.menge ) From ...." --> also den Feldern "Ean" und "kein Name angegeben" *gg
Ändere bitte auf
Und hier
Grüße
Biber
P.S & OT: Bei deinem Nicknamen würde mich schon interessieren, welche Art Gute-Nacht-Geschichten du deiner Tochter vorliest...
sorry, mein Fehler.
Woher soll irgendein hergelaufener Parser ( oder eine streunende Parserin) auch das Feld "Menge" in der Tabelle "i" kennen?
Ich Dussel hab die Pseudo-Tabelle i ja definiert mit "SELECT Inventur.ean, Sum( Inventur.menge ) From ...." --> also den Feldern "Ean" und "kein Name angegeben" *gg
Ändere bitte auf
- SELECT Inventur.ean, Sum( Inventur.menge ) as Menge From ....
Und hier
...geändert hatte war :a.Bestand - a.Menge in: a.Bestand - i.Menge weil ich denke so ist es richtig...
...hattest du recht -> natürlich i.Menge statt a.Menge. DAS hab ich oben korrigiert.Grüße
Biber
P.S & OT: Bei deinem Nicknamen würde mich schon interessieren, welche Art Gute-Nacht-Geschichten du deiner Tochter vorliest...
@Biber
danke für die Anregung mit dem JOIN (Select .....)
Das kannte ich so noch nicht.
Grüße vom it-frosch
danke für die Anregung mit dem JOIN (Select .....)
Das kannte ich so noch nicht.
Grüße vom it-frosch
Moin boesi666,
nur der Vollständigkeit halber:
a) Codeformatiert sieht es hybscher aus, finde ich
b) Falls, nur falls Performanz eine Rolle spielt, dann würde ich die Where-Clause noch ein wenig umformulieren, damit wenigstens ein paar Stage-2-Prädikate rausfallen.
c) Bitte setze den Beitrag auf "Erledigt", wenn es das ist.
Grüße
Biber
nur der Vollständigkeit halber:
a) Codeformatiert sieht es hybscher aus, finde ich
SELECT a.EAN, a.Artikel_Nr, a.Artikel_bezeichnung, a.Bestand
, i.Menge AS gezählt, (a.Bestand - i.Menge) AS Fehlbestand
FROM Artikel a
LEFT JOIN (SELECT Inventur.ean, SUM(Inventur.menge) AS Menge
FROM Inventur
GROUP BY ean) i ON i.ean = a.ean
WHERE i.ean IS NULL
AND a.Lagerartikel LIKE 'ja'
OR a.Bestand > i.Menge
AND a.Lagerartikel LIKE 'ja';
SELECT a.EAN, a.Artikel_Nr, a.Artikel_bezeichnung, a.Bestand
, i.Menge AS gezählt, (a.Bestand - i.Menge) AS Fehlbestand
FROM Artikel a
LEFT JOIN (SELECT Inventur.ean, SUM(Inventur.menge) AS Menge
FROM Inventur
GROUP BY ean) i ON i.ean = a.ean
WHERE a.Lagerartikel = 'ja'
AND ( i.ean IS NULL OR a.Bestand > i.Menge ) ;
c) Bitte setze den Beitrag auf "Erledigt", wenn es das ist.
Grüße
Biber
Moin boesi666,
eigentlich stellen wir hier im Froum eine Frage und danach eine neue, wenn die erste hinreichend beantwortet ist.
Du kannst auf mehreren Wegen dein Ziel erreichen.
a) Den Resultset in eine bestehende Tabelle pimpen:
-oder-
b) On-the-fly eine neue Tabelle anlegen
[sind natürlich ungetestete Skizzen]
Grüße
Biber
eigentlich stellen wir hier im Froum eine Frage und danach eine neue, wenn die erste hinreichend beantwortet ist.
Du kannst auf mehreren Wegen dein Ziel erreichen.
a) Den Resultset in eine bestehende Tabelle pimpen:
INSERT INTO existingTable ( EAN, ArtikelNr, Artikelbez, Bestand , Gezählt, Fehlbestand )
SELECT [ ....eins zu eins von oben...]
-oder-
b) On-the-fly eine neue Tabelle anlegen
CREATE TABLE newTable (
EAN char(15) NOT NULL
, ArtikelNr Char(12) NOT NULL
,...
PRIMARY KEY (EAN)
)
ENGINE=MyISAM
SELECT [ ....eins zu eins von oben...]
Grüße
Biber