SUM mehrere Abfrageergebnisse addieren

Hallo Hallo

Ich habe folgende Abfrage:

SELECT count (person.vorname) AS a
FROM Person INNER JOIN ((Gruppe INNER JOIN (Lager INNER JOIN stGrLa ON Lager.LaID = stGrLa.Lager) ON Gruppe.GrID = stGrLa.Gruppe) INNER JOIN stTeGr ON Gruppe.GrID = stTeGr.Gruppe) ON Person.PeID = stTeGr.Person;

SELECT count(peid) AS b
FROM Person INNER JOIN ((Gruppe INNER JOIN (Lager INNER JOIN stGrLa ON Lager.LaID = stGrLa.Lager) ON Gruppe.GrID = stGrLa.Gruppe) INNER JOIN stGrLe ON Gruppe.GrID = stGrLe.Gruppe) ON Person.PeID = stGrLe.Person;

SELECT count(peid) AS c
FROM Person INNER JOIN (Lager INNER JOIN stLaSt ON Lager.LaID = stLaSt.Lager) ON Person.PeID = stLaSt.Person;

SELECT sum(a+b+c);

Das ganze Funktioniert aber nicht. Hier ->SELECT sum(a+b+c) erscheint immer die Fehlermeldeung das a nicht existiert. Was mach ich falsch und wie geht es richtig??

Zum Verständnis: Es soll am Schluss die Gesamtsumme der 3 Abfragen angezeigt werden.

Vielen Dank im Vorraus.

Das waren 3 Abfragen, die je eine Spalte liefern. Du willst

SELECT sum(a+b+c);

nun praktisch diese 3 Zeilen als eine Tabelle mit einer Spalte und von dieser Spalte die Summe.

Also vereint man zuerst einmal mit UNION die 3 Teilergebnisse. Ich mache das mal ganz simpel:

test=*# select 5 union select 6 union select 7;
 ?column?
----------
        5
        6
        7
(3 rows)

Damit wir die Spalte vernünftig ansprechen können, geben wir der einen Namen, sagen wir mal a.
Außerdem geben wir der Result-Tabelle auch einen Namen, sagen wir mal x. Und nun wollen wir die Summe der Spalte a aus der Tabelle x:

test=# select sum(x.a) from (select 5 as a union select 6 as a union select 7as a) x;
 sum
-----
  18
(1 row)

Prinzip verstanden? Du brauchst nun nur noch die 3 einzelnen Selects von mir mit den von Dir ersetzen.


Andreas

Vielen Dank. Es hat funktioniert. Schon wider etwas gelernt. Ich denke mal das kann ich noch öfters brauchen.

Sodela ich habe ein Problem:

SELECT sum(x.a) FROM
(

SELECT COUNT(person.peid) AS a
FROM Person INNER JOIN (Lager INNER JOIN ((Gruppe INNER JOIN stGrLa ON Gruppe.GrID = stGrLa.Gruppe) INNER JOIN stTeGr ON Gruppe.GrID = stTeGr.Gruppe) ON Lager.LaID = stGrLa.Lager) ON Person.PeID = stTeGr.Person
WHERE (((Lager.LaID)=2))

UNION

SELECT COUNT(person.peid) AS a
FROM Person INNER JOIN ((Lager INNER JOIN (Gruppe INNER JOIN stGrLa ON Gruppe.GrID = stGrLa.Gruppe) ON Lager.LaID = stGrLa.Lager) INNER JOIN stGrLe ON Gruppe.GrID = stGrLe.Gruppe) ON Person.PeID = stGrLe.Person
WHERE (((Lager.LaID)=2))

UNION

SELECT COUNT (person.peid) AS a
FROM Person INNER JOIN (Lager INNER JOIN stLaSt ON Lager.LaID = stLaSt.Lager) ON Person.PeID = stLaSt.Person
WHERE (((Lager.LaID)=2))
)

x;

die Erste Abfrage gibt 26 zurück, die zweite 5 und die 3. auch 5. Zusammen - Laut PGSQL gibt das 31.

Wenn die Abfragen 26, 5 und 6 zurückgeben kommt 37 als Ergebnis raus.

Wie geht sowas. Kann das Ding nicht mehr rechnen??

Ich weis nicht was ich falsch machen kann

Mein Fehler, verwende UNION ALL anstatt nur UNION.

Grund ist, daß UNION nur unique - Resultate liefert, was man mit dem ALL verhindert - dann liefert es alle.

Andreas