Summe aus DISTINCT Werten

Hallo !

Ich hab eine MySQL Tabelle, die vereinfacht so aussieht:

Bock Auftrag Kapazität
------------------------
1 1 1000
1 2 1000
1 3 1000
2 4 333
3 5 600
2 6 333
2 7 333
4 8 1200
3 9 600

Die Tabelle hat noch mehr Spalten, die sind aber für diese Abfrage unwichtig. Kurz zur Erläuterung der Spalten:

Auftrag ist die Auftragsnummer. Diese Spalte ist der Primary Key und nur einmal in der Tabelle enthalten.

Bock ist die Nummer des Gestells, zu dem Auftrag zugeordnet ist. Es gibt mehrere Auftrag pro Bock.

Kapazität ist die (Überraschung !) Kapazität von Bock. Diese Information gehört eigentlich in eine eigene Tabelle, weil es pro Bock nur eine Angabe zur Kapazität. Die Angabe ist in der Tabelle also redundant vorhanden.

Was ich erreichen möchte ist eine Abfrage, die mir die Gesamtkapazität aller Böcke ausgibt. Die Redundanz der Daten kriege ich auf folgende Weise raus:

select min(Kapazität) from Tabelle group by Bock

Das Ergebnis ist folgendes:

Kapazität
----------
1000
333
600
1200

Damit erreiche ich eine Auflistung der vorhandenen Böcke samt Kapazität. Jetzt müsste ich nur noch die Gesamtsumme ermitteln und ich weiß leider nicht wie. Kann mir da jemand auf die Sprünge helfen ?

P.S.
ja ich weiß, dass das Layout der Tabelle nicht optimal ist, leider kann ich sie aber nicht ändern.

Moin, RedWraith,

mach 2 Abfragen draus, die erste namens Bock:

 SELECT min(Kapazität) AS BockKap
 FROM Auftrag
 GROUP BY Bock;

 SELECT sum(BockKap) AS KapSum
 FROM Bock;

Wahrscheinlich kann man das zu einer Query zusammenpacken.

Logischer wäre eigentlich

 SELECT Distinct(Kapazität) AS BockKap
 FROM Auftrag

Gruß Ralf

Servus,

eigentlich sollte so was wie

SELECT sum(DISTINCT(kapazitaet))
FROM tabelle

das gewünschte Ergebnis liefern.

Gruss,
SomeOne

Hi !

Das Problem ist, dass die Angabe bei Kapazität nicht distinct ist, sondern die Bocknummer.

Haben die Gestelle 1, 2 und 3 jeweils eine Kapazität von 1000 würde mit diesem Vorschlag ein Gesamtwert von 1000 dabei herauskommen, wobei 3000 richtig wäre.

Zomg!

Du hast recht, zuerst gruppieren und dann summieren :smile:

Select sum(Betrag) from (select min(b.Kapazität) as Betrag from Tabelle b group by Bock) as Tabelle2

Danke !

Manchmal sieht man den Wald vor lauter Bäumen nicht.

Hallo,

du bist schon fast am Ziel - wie wäre es jetzt noch mit einem Subselect:

select
 sum(kap)
from
 (
 select 
 min(Kapazität) as kap 
 from Tabelle 
 group by
 Bock
 )

gruss
bernhard