Laden...

SQL-Statement spezielle Gruppierung (MySQL und DB2)

Letzter Beitrag vor 14 Jahren 11 Posts 1.937 Views
SQL-Statement spezielle Gruppierung (MySQL und DB2)

Hallo,

ich möchte in meinen Datenbanken eine "spezielle" Gruppierungsabfrage machen (ähnlich wie ein KgV). Dazu habe ich bspw. folgende Datensätze:

tbl_Person
ID / Name
0 / Hans
1 / Tom
2 / Marta
3 / Norbert

tbl_Auftrag
Auftragsnr / Person
1000 / 0
1000 / 1
1000 / 3
2010 / 1
2010 / 2
2010 / 3
3015 / 1
3015 / 3
4540 / 0
4540 / 1
4540 / 2
4540 / 3

Nun möchte ich mit einem SQL Statement herausfinden, welche Personen bei allen aufgelisteten Aufträgen beteiligt waren. In diesem Falle also Person 1 und 3:

An Auftrag 1000 ist Person 1 und 3 beteiligt
An Auftrag 2010 ist Person 1 und 3 beteiligt
An Auftrag 3015 ist Person 1 und 3 beteiligt
An Auftrag 4540 ist Person 1 und 3 beteiligt

Ich möchte also Personen 1 und 3 als Datensätze erhalten. Hat jemand eine Idee?

Danke im Voraus!

SELECT
 A.Auftragsnr
 P.Name
FROM
 tbl_Person P,
 tbl_Auftrag A
where P.ID = A.Person 
 AND A.Auftragsnr = 1000

Ergebniss:
Auftragsnr | Name
1000       | Hans
1000       | Tom
1000       | Norbert

Ich hoffe das meintest du.

MfG
Björn

Das Leben ist schön!

Nein, Hans darf nicht im Ergebnis enthalten sein ...

Oh, sorry hatte dich miss verstanden.

SELECT 
 A.Auftragsnr 
FROM 
 tbl_Person P, 
 tbl_Auftrag A 
where P.ID = A.Person 
 AND  P.ID in (1,3)
group by  A.Auftragsnr 
having count(*) = 2

Das liefert dir die Auftragsnummer, in welchem Benutzer 1 und 3 **gemeinsamm **vorhanden sind.
Damit kannst du dann ja weiter Joinen.

MfG
Björn

Das Leben ist schön!

Wenn es vier verschiedene Aufträge gibt, muss die Person in der tbl_Auftrag vier Zeilen besitzen. Also einmal DISTINCT Auftragsnummer zählen und dann die Zeilen gruppiert nach der Person zählen. Das geht in einem Statement wenn DISTINCT Auftragsnummer als Where-Subselect gezählt wird.

@Viper: danke für das Beispiel. Ich will die Abfrage jedoch allgemeingültig machen und nicht konkret für dieses Beispiel ..

@witte: kannst du bitte ein Beispielstatement schreiben?

Witte hat genau das hat das beschrieben was ich dir als Beispiel geschrieben habe.

Das Leben ist schön!

Ich dachte eher so:


SELECT Person,COUNT(*) AS anzahl
FROM tbl_Auftrag
GROUP BY Person
HAVING COUNT(*) = (SELECT COUNT(*) FROM (SELECT DISTINCT Auftragsnr FROM tbl_Auftrag))

Ich weiß nicht ob Deine mysql-Version dynamic views unterstützt, probier mal.
@Viper78: P.ID in (1,3) hat er beispielhaft gemeint. Er will Personen haben die an allen Aufträgen beteiligt sind.

Das funktioniert leider nicht 😦

Mit dieser Bemerkung wird Dir niemand helfen können, Du solltest schon beschreiben welche Fehlermeldung/Ausgaben erscheinen.
Außerdem habe ich den Weg nur prinzipiell gezeigt, Du müsstest das noch auf Mysql/DB2 adaptieren.

Naja keine Fehlermeldung, aber die Ergebnistabelle ist leer unter bestimmten Umständen ... z.B. wenn es immer identisch viele Personen gibt zu einem Auftrag ...