Vergleich zweier Spalten (Unterschied in Spalte b)

Paddiwan

Benutzer
Beiträge
5
Guten Morgen,

ich versuche seit längerem einen Vergleich per SQL zu erstellen.

Spalte A | Spalte B
Artikel 1 | Status 1
Artikel 2 | Status 1
Artikel 1 | Status 2
Artikel 2 | Status 1
Artikel 1 | Status 1

Hierbei soll der Artikel in Spalte A nur einmal angezeigt werden, solange Spalte B übereinstimmt. Gibt es in Spalte B aber zum betroffenen Artikel unterschiedliche Einträge, so sollen diese mit ausgewiesen werden.

Als Ergebnis würde ich folgendes erwarten:
Spalte A | Spalte B
Artikel 1 | Status 1
Artikel 2 | Status 1
Artikel 1 | Status 2

Ich habe es mit Count und Having probiert, allerdings bekomme ich die Verkettung der o.g. Bedingung nicht hin.

Danke für Eure Hilfe und liebe Grüße
 
Werbung:

dabadepdu

Datenbank-Guru
Beiträge
572
Was bedeuetet denn "solange"?
Deine Spalten zeigen keine Reihenfolge an. Wenn Du sowas machen möchtest, brauchst Du wahrscheinlich ein Sortierkriterium. Und vielleicht Window Functions.
 

Paddiwan

Benutzer
Beiträge
5
Es soll einfach nach Spalte A und B (group by) gruppiert werden, das ist aber nicht mein Problem. Habe es nur mit angegeben, falls einer den Code für mich versucht. Die Herausforderung ist für mich, den Vergleich nach o.g. Kriterien durchzuführen :-(
 

dabadepdu

Datenbank-Guru
Beiträge
572
Das ist nur ein Group by. Ich verstehe Dein Problem nicht.
Nochmal: "Solange" ist keine hinreichende Problembeschreibung.
 

Paddiwan

Benutzer
Beiträge
5
Ich versuche es noch mal mit dem Praxisbeispiel, das Beispiel oben sollte nur der Veranschaulichung dienen.



Diesen Code habe ich bisher:

select
artikel,
count (artikel) as positionen,
status from tabelle
where status in ('08','09')
group by artikel,status
order by artikel

Aktuell wird also nur schlichtweg nach Artikeln gesucht, deren Status 08 oder 09 aussagt. Hierbei wird eine extra Spalte erzeugt, bei der die Positionen der Artikel gezählt werden. Das Ergebnis sieht wie folgt aus:

artikelstatuspositionen
1022291.09.10091
1022291.09.10081
1022511.09.100921

Es gibt also in meiner Tabelle zu Artikel 1022291.09.10 zwei Datensätze, einen in Status 09 und einen in Status 08. Zu Artikel 1022511.09.10 gibt es in Status 09 21 Datensätze.

Mein Ziel ist es, dass das Ergebnis wie folgt aussieht:
artikelstatus
1022291.09.1009
1022291.09.1008

Ich möchte also ohne count jene artikel-status-kombinationen nur einmal anzeigen lassen und auch nur wenn es für einen artikel verschiedene status gibt. Hoffentlich habe ich mich verständlich ausgedrückt.

Wahrscheinlich ist das super einfach ;-)
 

dabadepdu

Datenbank-Guru
Beiträge
572
Na so ganz klar ist es immer noch nicht, zB: 2 Stati sind verschieden, ja, was ist mit 3 Stati (wenn auf 8 und 9 eingeschränkt ist.

Code:
SELECT artikel, status 
  FROM tabelle t1 
  JOIN (
    select
      artikel
      from tabelle
     where status in ('08','09')
     group by artikel
    having count(status)=2) t2
    ON t1.artikel = t2.artikel
 WHERE status in ('08','09')
 

Paddiwan

Benutzer
Beiträge
5
Danke dir vielmals für die Hilfe, eigentlich dürfte es nur zwei verschiedene Stati geben...
Bzw. die Abfrage zielt genau auf die zwei Stati ab, da es nur bei diesen zu Überschneidungen kommen kann.

Aber jetzt wird doch nur geprüft, was Status 08/09 hat und dabei zwei Positionen. Es werden also Artikel mit zwei Zeilen ausgewiesen, selbst wenn der Status in beiden Fällen 08 ist.

Hier ein Auszug aus dem Ergebnis:
artikelstatus
1015504.09.1009
1015504.09.1009
1022291.09.1009
1022291.09.1008
1056221.09.7009
1056221.09.7009


LG
 

dabadepdu

Datenbank-Guru
Beiträge
572
Hab ich nicht bedacht, vielleicht so?
Code:
SELECT distinct t1.artikel, t1.status 
  FROM tabelle1 t1 
  JOIN (
    select distinct
      artikel
      from (select distinct artikel,status 
              from tabelle1 where status in ('08','09')) x 
     group by artikel
    having count(status)=2) t2
    ON t1.artikel = t2.artikel
 WHERE status in ('08','09')
Geht vermutlich auch eleganter und bei großen Mengen auch schneller.
 
Werbung:
Oben