SQL - Werte in zwei Tabellen vergleichen - Aus einer Tabelle sollen nur bestimmet Datensätze verwendet werden
Halllo zusammen, ich habe ein kniffliges SQL - Problem und hoffe mir kann jemand weiterhelfen 
Ich habe zwei Tabellen, Tab1, Tab2, die sehen so aus:
Tab1:
Tab2:
Nun möchte ich die Artikel finden, die in Tab1 und Tab2 einen unterschiedlichen Preis haben, und zwar unter folgenden Bedingungen:
Nur die Artikel vergleichen, bei denen in Tab1 die Preisliste_Nr = 10 ist.
Diese sollen mit den entspechenden Artikeln in Tab2 verglichen werden, bei denen das Preis_Kennzeichen = E ist und die dort das neuese Datum haben (also wo das Datum am größten ist)
Das Ergebniss sollte so aussehen:
Ich hab das mit folgenden Statement versucht:
select a.Artikel_Nr, a.Preisliste_Nr, a.Datum, a.Preis,
b.Artikel_Nr, b.Preis_Kennzeichen, b.Datum, b.Preis
from Tab1 a, Tab2 b
where a.Artikel_Nr = b.Artikel_Nr
and a.Preisliste_Nr = '10'
and b.Preis_Kennzeichen = 'E'
and a.Preis <> b.Preis;
Als Ergebnis bekomme ich das:
Ist ja auch klar, weil ich in Tab2 die Auswahl nicht auf die Datensätze mit dem neuesten Datum beschränkt hab (b.Datum)
Ich weis aber nicht wie ich das machen soll, ich vermute mit max(b.Datum), weil die Datumswerte so angelegt sind, das die neuesten den höchsten Wert haben. Aber ich habe keine Ahnung wie ich so ein select in das Statement mit einbauen kann
Ich hoffe von Euch kann mir jemand helfen,
Vielen Dank, Matze
Ich habe zwei Tabellen, Tab1, Tab2, die sehen so aus:
Tab1:
Artikel_Nr | Preisliste_Nr | Datum | Preis |
---|---|---|---|
1 | 20 | 20100511 | 11,20 |
2 | 10 | 20100511 | 7,30 |
3 | 10 | 20100511 | 5,60 |
3 | 20 | 20100511 | 5,80 |
3 | 30 | 20100511 | 6,20 |
4 | 10 | 20100511 | 62,30 |
Tab2:
Artikel_Nr | Preis_Kennzeichen | Datum | Preis |
---|---|---|---|
1 | E | 20100612 | 10,60 |
1 | E | 20100630 | 10,40 |
1 | E | 20100520 | 11,50 |
1 | F | 20100610 | 11,30 |
2 | E | 20091216 | 7,30 |
2 | F | 20090817 | 7,50 |
2 | G | 20100113 | 7,20 |
3 | E | 20090620 | 5,70 |
3 | E | 20100415 | 5,60 |
4 | E | 20090613 | 64,20 |
4 | G | 20080603 | 61,20 |
4 | G | 20090216 | 65,40 |
Nun möchte ich die Artikel finden, die in Tab1 und Tab2 einen unterschiedlichen Preis haben, und zwar unter folgenden Bedingungen:
Nur die Artikel vergleichen, bei denen in Tab1 die Preisliste_Nr = 10 ist.
Diese sollen mit den entspechenden Artikeln in Tab2 verglichen werden, bei denen das Preis_Kennzeichen = E ist und die dort das neuese Datum haben (also wo das Datum am größten ist)
Das Ergebniss sollte so aussehen:
Artikel_Nr | Preisliste_Nr | Datum | Preis | Artikel_Nr | Preis_Kennzeichen | Datum | Preis | |
---|---|---|---|---|---|---|---|---|
1 | 10 | 20100511 | 10,3 | 1 | E | 20100630 | 10,40 | |
4 | 10 | 20100511 | 62,3 | 4 | E | 20090613 | 64,20 |
Ich hab das mit folgenden Statement versucht:
select a.Artikel_Nr, a.Preisliste_Nr, a.Datum, a.Preis,
b.Artikel_Nr, b.Preis_Kennzeichen, b.Datum, b.Preis
from Tab1 a, Tab2 b
where a.Artikel_Nr = b.Artikel_Nr
and a.Preisliste_Nr = '10'
and b.Preis_Kennzeichen = 'E'
and a.Preis <> b.Preis;
Als Ergebnis bekomme ich das:
Artikel_Nr | Preisliste_Nr | Datum | Preis | Artikel_Nr | Preis_Kennzeichen | Datum | Preis | |
---|---|---|---|---|---|---|---|---|
1 | 10 | 20100511 | 10,3 | 1 | E | 20100612 | 10,60 | |
1 | 10 | 20100511 | 10,3 | 1 | E | 20100630 | 10,40 | |
1 | 10 | 20100511 | 10,3 | 1 | E | 20100520 | 11,50 | |
3 | 10 | 20100511 | 5,6 | 3 | E | 20090620 | 5,70 | |
4 | 10 | 20100511 | 62,3 | 4 | E | 20090613 | 64,20 |
Ist ja auch klar, weil ich in Tab2 die Auswahl nicht auf die Datensätze mit dem neuesten Datum beschränkt hab (b.Datum)
Ich weis aber nicht wie ich das machen soll, ich vermute mit max(b.Datum), weil die Datumswerte so angelegt sind, das die neuesten den höchsten Wert haben. Aber ich habe keine Ahnung wie ich so ein select in das Statement mit einbauen kann
Ich hoffe von Euch kann mir jemand helfen,
Vielen Dank, Matze
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 146543
Url: https://administrator.de/forum/sql-werte-in-zwei-tabellen-vergleichen-aus-einer-tabelle-sollen-nur-bestimmet-datensaetze-verwendet-werden-146543.html
Ausgedruckt am: 22.04.2025 um 14:04 Uhr
2 Kommentare
Neuester Kommentar
Moin XSD2612,
willkommen im Forum.
Biite bei SQL-Fragen immer das Blech angeben, was drunterliegt.
Denn weniger standardisiert als "SQL" sind nur noch die Rezeptvariationen für "Birne Helene" und deutsche Steuergesetze.
Eine der vielen Möglichkeiten wäre, deine bisherige Abfrage als "innere Abfrage" as is zu erhalten und eine aggregierende Query drumherumzuwickeln.
Oder aber, die Aggregation in einer SubQuery abzufackeln.
Okay, vorher aber noch die bestehende etwas weniger redundant machen.
--> Das wäre immer noch "deine" Query, nur ohne doppelte Felder (ist echt nicht nötig) und erst recht ohne doppelte Feldnamen mit unterschiedlichem Inhalt.
Wenn wir jetzt zusätzlich zu "Tab2 b" die Werte aus einer "Grouped By-Tab2" mit Alias c holen
--> dann sollte es klappen.
Die WHERE-Klausel innerhalb der neuen virtuellen Tabelle c kann ebensogut nach unten - sonst ist das Statement nicht richtig einleuchtend.
[ungetestete Skizze]
Grüße
Biber
[Edit] Sorry, das "from Tab2" fehlte bei den beiden Group-by-Varianten unten [/Edit]
willkommen im Forum.
Biite bei SQL-Fragen immer das Blech angeben, was drunterliegt.
Denn weniger standardisiert als "SQL" sind nur noch die Rezeptvariationen für "Birne Helene" und deutsche Steuergesetze.
Eine der vielen Möglichkeiten wäre, deine bisherige Abfrage als "innere Abfrage" as is zu erhalten und eine aggregierende Query drumherumzuwickeln.
Oder aber, die Aggregation in einer SubQuery abzufackeln.
Okay, vorher aber noch die bestehende etwas weniger redundant machen.
select a.Artikel_Nr, a.Preisliste_Nr, a.Datum as Preislistendatum, a.Preis as PL_Preis,
b.Preis_Kennzeichen, b.Datum, b.Preis
from Tab1 a, Tab2 b
where a.Artikel_Nr = b.Artikel_Nr
and a.Preisliste_Nr = '10',
and b.Preis_Kennzeichen = 'E'
and a.Preis <> b.Preis;
Wenn wir jetzt zusätzlich zu "Tab2 b" die Werte aus einer "Grouped By-Tab2" mit Alias c holen
select a.Artikel_Nr, a.Preisliste_Nr, a.Datum as Preislistendatum, a.Preis as PL_Preis,
b.Preis_Kennzeichen, b.Datum, b.Preis
from Tab1 a, Tab2 b, ( select Artikel_nr, max(Datum) as maxdatum
from Tab2
Where Preis_Kennzeichen = 'E'
Group by Artikel_nr, Preis_Kennzeichen) c
where a.Artikel_Nr = b.Artikel_Nr
and b.Artikel_nr = c.Artikel_nr
and a.Preisliste_Nr = '10'
and b.Preis_Kennzeichen = 'E'
and a.Preis <> b.Preis
and b.datum = c.Maxdatum
;
Die WHERE-Klausel innerhalb der neuen virtuellen Tabelle c kann ebensogut nach unten - sonst ist das Statement nicht richtig einleuchtend.
select a.Artikel_Nr, a.Preisliste_Nr, a.Datum as Preislistendatum, a.Preis as PL_Preis,
b.Preis_Kennzeichen, b.Datum, b.Preis
from Tab1 a, Tab2 b, ( select Artikel_nr, Preis_Kennzeichen, max(Datum) as maxdatum
from Tab2
Group by Artikel_nr, Preis_Kennzeichen) c
where a.Artikel_Nr = b.Artikel_Nr
and b.Artikel_nr = c.Artikel_nr
and a.Preisliste_Nr = '10'
and b.Preis_Kennzeichen = 'E'
and b.Preis_Kennzeichen = c.Preis_Kennzeichen
and a.Preis <> b.Preis
and b.datum = c.Maxdatum
;
Grüße
Biber
[Edit] Sorry, das "from Tab2" fehlte bei den beiden Group-by-Varianten unten [/Edit]