SQL Abfrage - Bedingung von 2 Datensätzen zu einem Datensatz

twuerzinger

Neuer Benutzer
Beiträge
4
Hallo zusammen,

ich habe ein Problem und zwar habe ich eine Tabelle Auftraege mit der Spalte Auftragsnummer und Artikelnummer. Jetzt will wissen, welchen Auftragsnummern die Artikelnummern 1535145 und 5463258 zugeordnet sind. Ich will aber bloß die Auftragsnummern ausgegeben haben, denen beide Artikelnummern zugeordet sind (keine or Abfrage). Mit and funktioniert es auch nicht. Ich weiß das es irgendwie mit einem Subselect funktioniert, komme aber einfach nicht darauf, deshalb bitte ich um eure Hilfe.
 
Werbung:
Moin moin,

mal so aus der hüfte geschossen:

select *
from auftraege
where artikelnummer in(1535145,5463258);

Das sollte es doch sein oder nicht? ;)
 
Mal vereinfacht, du hast:

Code:
test=*# select * from twuerzinger ;
 auftrag | artikel
---------+---------
  10 |  10
  10 |  20
  11 |  30
  12 |  30
  12 |  10
(5 Zeilen)

und willst wissen, welcher Auftrag sowohl Artikel 10 als auch 30 hat:

Code:
test=*# select auftrag, array_agg(artikel) from twuerzinger group by auftrag having array_agg(artikel) @> array[10,30];
 auftrag | array_agg
---------+-----------
  12 | {30,10}
(1 Zeile)

Das ist jetzt allerdings PostgreSQL, das wird nicht 1:1 bei Dir funktionieren, aber Du siehst vielleicht den Weg ...
 
@
Chuky666
nein leider nicht. Bei der Abfrage gibt er ja jede Auftragsnummer zu beiden Artikeln aus. Ich will ja nur die Aufträge ausgegeben haben wo beide vorkommen. Ich brauch auch nur die Spalte Auftraege ausgegeben.

Also ich will es beispielsweise nicht so ausgegeben haben:

Auftragsnummer | Artikelnummer
546254..................1535145
546255..................1535145
546256..................1535145
546257..................5463258
546258.................5463258
546254.................5463258
546255................ 5463258

sondern beispielsweise so:

Auftragsnummer
546254 (da diese Nummern der Artikelnummer 1535145 und 5463258 zugeordnet sind)
546255
 
Zuletzt bearbeitet:
Mal vereinfacht, du hast:

Code:
test=*# select * from twuerzinger ;
auftrag | artikel
---------+---------
  10 |  10
  10 |  20
  11 |  30
  12 |  30
  12 |  10
(5 Zeilen)

und willst wissen, welcher Auftrag sowohl Artikel 10 als auch 30 hat:

Code:
test=*# select auftrag, array_agg(artikel) from twuerzinger group by auftrag having array_agg(artikel) @> array[10,30];
auftrag | array_agg
---------+-----------
  12 | {30,10}
(1 Zeile)

Das ist jetzt allerdings PostgreSQL, das wird nicht 1:1 bei Dir funktionieren, aber Du siehst vielleicht den Weg ...

ich weiß leider nicht wie ich das Array Feld bei mir umsetzten soll....
und außerdem will ich ja bloß die Auftragsnummern ausgegeben haben, also ich will eine Spalte haben nicht zwei
 
Zuletzt bearbeitet:
Wenn die eine Spalte nicht auftachen soll - einfach weglassen. Einfach, oder?

Code:
test=*# select array_agg(artikel) from twuerzinger group by auftrag having array_agg(artikel) @> array[10,30];
 array_agg
-----------
 {30,10}
(1 Zeile)

test=*# select string_agg(artikel::text,', ') from twuerzinger group by auftrag having array_agg(artikel) @> array[10,30];
 string_agg
------------
 30, 10
(1 Zeile)

test=*#

Ich weiß nicht, was M$SQL an Aggregatsfunktionen hat.
 
Werbung:
Sehr gut funktioniert! Stimmt eigentlich ist es echt einfach, aber ich bin einfach nicht draufgekommen :confused:
:), weil ich eben gedacht habe, dass es mit einem Subselect funktioniert.

Vielen Dank! :)

Aber in der Group by Klausel kommt noch Auftragsnummer dazu sonst bekommt man eine Fehlermeldung.
 
Zurück
Oben