Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

My SQl Abfrage, 2 tabellen vergleichen und auswerten

Frage Entwicklung Datenbanken

Mitglied: boesi666

boesi666 (Level 1) - Jetzt verbinden

08.12.2011, aktualisiert 17:58 Uhr, 4905 Aufrufe, 12 Kommentare

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!!!
Mitglied: it-frosch
08.12.2011 um 18:25 Uhr
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
Bitte warten ..
Mitglied: Biber
08.12.2011 um 18:36 Uhr
Moin boesi666,

willkommen im Forum.


Ungetestet würde ich auf anderem Weg als it-frosch vorschlagen
01.
SELECT Artikel.EAN 
02.
     , Artikel.Artikel_Nr 
03.
	 , Artikel.Artikel_bezeichnung 
04.
	 , Artikel.Bestand 
05.
	 , Inventur.Menge as gezählt 
06.
	 , (Artikel.Bestand-Inventur.Menge )as Fehlbestand  
07.
	 FROM Artikel left JOIN (select ean, Sum(menge) from Inventur group by ean from Inventur) Inventur   
08.
	 on Inventur.ean = Artikel.ean  
09.
	 where Inventur.ean is null or Artikel.Bestand > Inventur.Menge 	 
- oder so, dass ich es lesen kann -
01.
	  
02.
SELECT a.EAN 
03.
     , a.Artikel_Nr 
04.
	 , a.Artikel_bezeichnung 
05.
	 , a.Bestand 
06.
	 , i.Menge as gezählt 
07.
	 , (a.Bestand - i.Menge ) as Fehlbestand  
08.
	 FROM Artikel a left JOIN  (select ean, Sum(menge) from Inventur group by ean) i   
09.
	 on i.ean = a.ean  
10.
	 where i.ean is null or a.Bestand > i.Menge 	 


Grüße
Biber
Bitte warten ..
Mitglied: boesi666
08.12.2011 um 19:12 Uhr
^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!)
Bitte warten ..
Mitglied: boesi666
08.12.2011 um 20:52 Uhr
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
Bitte warten ..
Mitglied: Biber
08.12.2011 um 21:17 Uhr
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...
Bitte warten ..
Mitglied: it-frosch
08.12.2011 um 21:37 Uhr
@Biber

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

Grüße vom it-frosch
Bitte warten ..
Mitglied: boesi666
08.12.2011 um 22:29 Uhr
ja ))) 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

Danke!!
Bitte warten ..
Mitglied: Biber
09.12.2011 um 07:45 Uhr
Moin boesi666,

nur der Vollständigkeit halber:


a) Codeformatiert sieht es hybscher aus, finde ich
01.
SELECT a.EAN, a.Artikel_Nr, a.Artikel_bezeichnung, a.Bestand 
02.
       , i.Menge AS gezählt, (a.Bestand - i.Menge) AS Fehlbestand 
03.
FROM Artikel a  
04.
  LEFT JOIN (SELECT Inventur.ean, SUM(Inventur.menge) AS Menge 
05.
             FROM Inventur 
06.
             GROUP BY ean) i ON i.ean = a.ean 
07.
WHERE i.ean IS NULL 
08.
AND   a.Lagerartikel LIKE 'ja' 
09.
OR    a.Bestand > i.Menge 
10.
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.
01.
SELECT a.EAN, a.Artikel_Nr, a.Artikel_bezeichnung, a.Bestand 
02.
       , i.Menge AS gezählt, (a.Bestand - i.Menge) AS Fehlbestand 
03.
FROM Artikel a  
04.
  LEFT JOIN (SELECT Inventur.ean, SUM(Inventur.menge) AS Menge 
05.
             FROM Inventur 
06.
             GROUP BY ean) i ON i.ean = a.ean 
07.
WHERE a.Lagerartikel = 'ja' 
08.
AND ( i.ean IS NULL OR    a.Bestand > i.Menge ) ;
c) Bitte setze den Beitrag auf "Erledigt", wenn es das ist.

Grüße
Biber
Bitte warten ..
Mitglied: boesi666
09.12.2011 um 18:26 Uhr
01.
> SELECT a.EAN, a.Artikel_Nr, a.Artikel_bezeichnung, a.Bestand 
02.
>        , i.Menge AS gezählt, (a.Bestand - i.Menge) AS Fehlbestand 
03.
> FROM Artikel a  
04.
>   LEFT JOIN (SELECT Inventur.ean, SUM(Inventur.menge) AS Menge 
05.
>              FROM Inventur 
06.
>              GROUP BY ean) i ON i.ean = a.ean 
07.
> WHERE a.Lagerartikel = 'ja' 
08.
> AND ( i.ean IS NULL OR    a.Bestand > i.Menge ) ; 
09.
> 
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...
Bitte warten ..
Mitglied: boesi666
13.12.2011 um 00:39 Uhr
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...
Bitte warten ..
Mitglied: Biber
13.12.2011 um 07:32 Uhr
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:
01.
 INSERT INTO existingTable ( EAN, ArtikelNr, Artikelbez, Bestand , Gezählt,  Fehlbestand ) 
02.
SELECT [ ....eins zu eins von oben...]
-oder-

b) On-the-fly eine neue Tabelle anlegen
01.
 CREATE TABLE newTable ( 
02.
               EAN char(15)  NOT NULL 
03.
            , ArtikelNr Char(12) NOT NULL 
04.
              ,...  
05.
            PRIMARY KEY (EAN) 
06.
07.
           ENGINE=MyISAM  
08.
   SELECT  [ ....eins zu eins von oben...]
[sind natürlich ungetestete Skizzen]

Grüße
Biber
Bitte warten ..
Mitglied: boesi666
13.12.2011 um 19:07 Uhr
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

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
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Datenbanken
gelöst Schleifen in SQL-Abfrage bei 2 Tabellen (2)

Frage von Aximand zum Thema Datenbanken ...

Datenbanken
gelöst SQL-Abfrage - DISTINCT - letztes Datum (3)

Frage von emeriks zum Thema Datenbanken ...

Datenbanken
SUM oder AVG in SQL Abfrage dauert viel zu lange warum? (5)

Frage von samet22 zum Thema Datenbanken ...

Datenbanken
gelöst SQL-Abfrage mit MAX() (9)

Frage von FrAmEr zum Thema Datenbanken ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (18)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...