boesi666
Goto Top

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!!!

Content-Key: 177478

Url: https://administrator.de/contentid/177478

Printed on: April 19, 2024 at 20:04 o'clock

Member: it-frosch
it-frosch Dec 08, 2011 at 17:25:37 (UTC)
Goto Top
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. face-wink

grüße vom it-frosch
Member: Biber
Biber Dec 08, 2011 at 17:36:23 (UTC)
Goto Top
Moin boesi666,

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
Member: boesi666
boesi666 Dec 08, 2011 at 18:12:51 (UTC)
Goto Top
^Bin ja sprachlos über die schnelle hilfe!!

ich probiers nachher gleich aus (muss nur meine kleine tochter mal noch gute nacht sagen... solange muss es noch warten... aber DAN probier ich's gleich!)
Member: boesi666
boesi666 Dec 08, 2011 at 19:52:56 (UTC)
Goto Top
also so ganz klappts noch nicht.
Ich will das Ganze mit vb6 in eine access db abfragen. da das ganze imme so doof während der laufzeit ist mit dem probieren, usw.

habe ich die datenbank auf einem sql server unter linux einfach nachgebaut und bearbeite das immer mit phpmyadmin zum testen. bis die abfage laufen.

das hab ich nun auch wieder probiert und bekomme einen syntax fehler:

#1054 - Unknown column 'i.Menge' in 'field list'
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 )
FROM Inventur
GROUP BY ean

ein bisschen wird das wohl automatisch in phpmyadmin umformuliert ohne dass ich das mit absicht mache. das einizige was ich selbst geändert hatte war :
a.Bestand - a.Menge in: a.Bestand - i.Menge weil ich denke so ist es richtig...

aber i.menge ist unknown versteh ich nicht. so sieht die Tabelle Inventur aus:
ID ean Menge
1 111 4.0000
2 222 20.0000
3 111 2.0000

und so die artikel:

id ean Artikel_Bezeichnung Bestand Artikel_Nr
1 111 Testartikel 1 10.0000
2 222 Testartikel 2 20.0000
3 333 Testartikel 3 30.0000
4 444 Testartikel 4 40.0000
Member: Biber
Biber Dec 08, 2011 at 20:17:08 (UTC)
Goto Top
Moin boesi666,

Zitat von @boesi666:
aber i.menge ist unknown versteh ich nicht.

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...
Member: it-frosch
it-frosch Dec 08, 2011 at 20:37:32 (UTC)
Goto Top
@Biber

danke für die Anregung mit dem JOIN (Select .....)
Das kannte ich so noch nicht. face-wink

Grüße vom it-frosch
Member: boesi666
boesi666 Dec 08, 2011 at 21:29:45 (UTC)
Goto Top
ja face-smile))) das hat es wohl gebracht!

so sieht es jetzt aus und klappt :

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'

Das muss ich mir morgen bei klaren Kopf nochmal hier genau durchlesen um es auch komplett zu verstehen face-wink

Danke!!
Member: Biber
Biber Dec 09, 2011 at 06:45:30 (UTC)
Goto Top
Moin boesi666,

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';  
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.
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
Member: boesi666
boesi666 Dec 09, 2011 at 17:26:32 (UTC)
Goto Top
> 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


Ja das geht auch. habe ich so eingebaut. Danke vielmals. nu kann ich voller tatendrang weiter basteln... face-smile
Member: boesi666
boesi666 Dec 12, 2011 at 23:39:02 (UTC)
Goto Top
huhu zusammen, eine frage würde ich doch versuchen nochmal hierzu loszuwerden...

besteht die möglichkeit diese daten die ich durch diese abfrage nun erhalten habe direkt in eine andere tabelle zu schreiben?? gemacht hab ich das noch nicht. ich weiss, es gibt s osachen wie SELECT * INTO AUSWERTUNG FROM ... tja da gehts schon los...: denn From und dann müsste ja irgendwie nicht nur eine tabelle, sondern diese komplizierte abfrage rein.

alternativ, würde ich mein datagrid, welches mit der abfrage befüllt wurde durchrattern lassen und zeilenweise in ne neue tabelle mit insert into befehl abarbeiten lassen. aber das würd bei vielen einträgen ewig dauern und ist wohl auch nicht sehr elegant...
Member: Biber
Biber Dec 13, 2011 at 06:32:23 (UTC)
Goto Top
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:
 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...]
[sind natürlich ungetestete Skizzen]

Grüße
Biber
Member: boesi666
boesi666 Dec 13, 2011 at 18:07:27 (UTC)
Goto Top
ja sorry, das wusste ich, aber dachte mir eben, weil die abfrage eh schon komlpiziert war (für mich jedenfalls), dass ich den weiteren schritt bezugnehmend auf diese abfrage in einem neuen beitrag auch erst wieder lange erklären hätte müssen. hoffe, ihr nehmt es nicht so üblel face-smile

also die on the fly thematik ist ne coole sache hab jetzt so was hin bekommen:

SQL_string = "SELECT a.id as Art_Id, a.EAN , a.Artikel_Nr , a.Bestand as Soll_Menge, i.Menge , (a.Bestand - i.Menge ) as Differenz into Inventur_DI_TEst 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.id > 0 " & LAGERARTIKEL_Kurz & POSARTIKEL_Kurz & " and ( i.ean is null or a.Bestand > i.Menge ) "

(sorry dass ich auch hier nochmal keine schönere schreibweise abliefere)

das klappt so schon recht gut dass ich damit leben kann.

Er legt automatisch eine neue tabelle an und das total unkompliziert face-smile