xsd2612
Goto Top

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 face-smile

Ich habe zwei Tabellen, Tab1, Tab2, die sehen so aus:

Tab1:
Artikel_NrPreisliste_NrDatumPreis
1202010051111,20
210201005117,30
310201005115,60
320201005115,80
330201005116,20
4102010051162,30

Tab2:
Artikel_Nr Preis_KennzeichenDatumPreis
1E2010061210,60
1E2010063010,40
1E2010052011,50
1F2010061011,30
2E200912167,30
2F200908177,50
2G201001137,20
3E200906205,70
3E201004155,60
4E2009061364,20
4G2008060361,20
4G2009021665,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_NrDatum Preis Artikel_Nr Preis_KennzeichenDatumPreis
1102010051110,3 1E2010063010,40
4102010051162,3 4E2009061364,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_NrDatum Preis Artikel_Nr Preis_KennzeichenDatumPreis
1102010051110,31E2010061210,60
1102010051110,31E2010063010,40
1102010051110,31E2010052011,50
310201005115,63E200906205,70
4102010051162,34E2009061364,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 kannface-smile

Ich hoffe von Euch kann mir jemand helfen,

Vielen Dank, Matze

Content-Key: 146543

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

Printed on: April 25, 2024 at 02:04 o'clock

Member: Biber
Biber Jul 08, 2010 at 18:36:34 (UTC)
Goto Top
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.
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;
--> 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

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
;
--> dann sollte es klappen.

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
;
[ungetestete Skizze]

Grüße
Biber

[Edit] Sorry, das "from Tab2" fehlte bei den beiden Group-by-Varianten unten [/Edit]
Member: XSD2612
XSD2612 Jul 09, 2010 at 06:40:24 (UTC)
Goto Top
Hallo Biber,

vielen Dank für deine Hilfe!!
hat wunderbar funktioniert face-smile
Das ganze war für Oracle

Viele Grüße
XSD2612