Laden...

SQL-Statement spezielle Gruppierung (MySQL und DB2)

Erstellt von be4all vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.820 Views
B
be4all Themenstarter:in
66 Beiträge seit 2008
vor 13 Jahren
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!

V
162 Beiträge seit 2010
vor 13 Jahren
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!

B
be4all Themenstarter:in
66 Beiträge seit 2008
vor 13 Jahren

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

V
162 Beiträge seit 2010
vor 13 Jahren

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!

W
955 Beiträge seit 2010
vor 13 Jahren

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.

B
be4all Themenstarter:in
66 Beiträge seit 2008
vor 13 Jahren

@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?

V
162 Beiträge seit 2010
vor 13 Jahren

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

Das Leben ist schön!

W
955 Beiträge seit 2010
vor 13 Jahren

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.

B
be4all Themenstarter:in
66 Beiträge seit 2008
vor 13 Jahren

Das funktioniert leider nicht 😦

W
955 Beiträge seit 2010
vor 13 Jahren

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.

B
be4all Themenstarter:in
66 Beiträge seit 2008
vor 13 Jahren

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