(MySQL) Zwei Summen in einer Abfrage bilden möglich?
Klaus
- datenbank
Hallo,
ich würde gerne eine Abfrage auf eine Tabelle erstellen, in dem zwei Summen gebildet werden und gruppiert wird.
Die Tabelle enthält die folgenden relevanten Felder:
eine einzelne Summe kann ich wie folgt bilden:
select sum(menge),stelle from meine_tabelle where art = 'A' group by stelle
Kann ich mit nur einer Abfrage beide Summen erhalten, also Summe für Art=A und Summe für Art=B?
Ich muss danach durch eine Schleife laufen, die mir beide Summen für jede Stelle anzeigt und würde das nur ungern verschachteln.
Klaus
Ich probiere momentan am folgenden Statement rum, will aber noch nicht so richtig funktionieren, da ich nicht weiß, wie ich sinnvoll gruppieren soll:
SELECT sum(t1.menge) as SUMME_AB, sum(t2.menge) as SUMME_ZU, t1.stelle FROM meine_tabelle as t1 join meine_tabelle as t2 on t1.idnr=t2.idnr WHERE t1.art = 'AB' and t2.art = 'ZU' group by t1.stelle
Die angezeigte Summe ist jedenfalls falsch.
Klaus
select sum(menge),stelle from meine_tabelle where art = 'A' group by stelle
Kann ich mit nur einer Abfrage beide Summen erhalten, also Summe für Art=A und Summe für Art=B?
Das müßte eigenentlich funktionieren
select sum(menge),stelle from meine_tabelle where art = 'A' OR art = 'B' group by stelle
Struppi.
Hallo Struppi,
abgesehen davon, dass die Abfrage bei mir ein leeres Ergebnis liefert, kann es auch nicht wirklich funktionieren, da ich die Summe ja gerne auch anzeigen lassen möchte, hier also einen Alias brauche und wie wird dann unterschieden, welche Summe ich jetzt habe? Summe von A oder/und Summe von B?
Klaus
abgesehen davon, dass die Abfrage bei mir ein leeres Ergebnis liefert,
Bei mir nicht. Ich habe mir aufgrund deiner Angaben eine Testtabelle zusammengebaut und damit funktioniert die Abfrage.
kann es auch nicht wirklich funktionieren, da ich die Summe ja gerne auch anzeigen lassen möchte, hier also einen Alias brauche und wie wird dann unterschieden, welche Summe ich jetzt habe? Summe von A oder/und Summe von B?
Mit deiner Abfrage gar nicht, Deshalb musst du das Feld art in die Abfrage miteinbauen.
Struppi.
Ich habs doch selbst hinbekommen und will euch das Ergebnis natürlich nicht vorenthalten: (bin mir aber nicht sicher, ob das nicht etwas einfacher ginge)
select sum(t1.menge) as summe_zu,t2.summe_ab,t1.stelle from meine_tabelle as t1 left join (select sum(menge) as summe_ab,stelle from meine_tabelle where idnr='1' AND art = 'AB' group by stelle) as t2 on t1.stelle=t2.stelle where t1.idnr='1' AND art='ZU' group by t1.stelle
Klaus
moin,
select sum(t1.menge) as summe_zu,t2.summe_ab,t1.stelle from meine_tabelle as t1 left join (select sum(menge) as summe_ab,stelle from meine_tabelle where idnr='1' AND art = 'AB' group by stelle) as t2 on t1.stelle=t2.stelle where t1.idnr='1' AND art='ZU' group by t1.stelle
vergiss diese abfage, sie ist falsch, auch wenn die richtigen ergebnisse rauskommen sollten.
das einfachste wäre, dass du nicht nur nach der Stelle gruppierst, sondern auch nach der art.
select sum(menge) Summe, stelle, art
from meine_tabelle
where art IN ('A', 'B'
group by stelle, art
;
willst du unbebedingt die summen von A und B in einer Zeile, gibt es mehrere möglichkeiten, entweder innerhalb einer gruppierung mit CASE arbeiten oder aber mit einer korrelierten Unterabfrage.
Ilja
select sum(menge) Summe, stelle, art
from meine_tabelle
where art IN ('A', 'B'
group by stelle, art
;
upps, eine schließende klammern um das IN heraum vergessen, aber das siehst du schon oder ?
where art IN ('A', 'B')
ps: ich würde immer noch einen editions-button begrüßen.....
Ilja
Tach auch.
select sum(menge) Summe, stelle, art
from meine_tabelle
where art IN ('A', 'B'
group by stelle, art
;
Ich würde es so machen:
Select sum(if(art = 'A', menge, 0)) As summeA, sum(if(art = 'B', menge, 0)) As summeB, stelle
from meine_tabelle
group by stelle
Bis die Tage,
Matti
moin,
Select sum(if(art = 'A', menge, 0)) As summeA, sum(if(art = 'B', menge, 0)) As summeB, stelle
from meine_tabelle
group by stelle
genau, das ist der CASE fall, CASE wäre deswegen besser, weil es so gut wie jedes dbms unterstützt, geht aber genauso.
Ilja
Tach auch.
genau, das ist der CASE fall, CASE wäre deswegen besser, weil es so gut wie jedes dbms unterstützt, geht aber genauso.
Ich muss zugeben, dass ich zunächst gedacht hatte, du würdest es mit CASE schaffen, die beiden Summen in einem Ausdruck zu schreiben (was meinem Verständnis sehr quer lag :-)).
Nun bin ich darauf gekommen, dass du CASE einfach als ein syntaktisch anderes IF verwenden willst. Nun wirds mir klar, was du meinst.
Ich finde die IF-Variante als ein wenig besser zu lesen, aber das ist Geschmackssache.
Bis die Tage,
Matti
moin,
Ich finde die IF-Variante als ein wenig besser zu lesen, aber das ist Geschmackssache.
ist sicherlich auch ein wenig geschmackssache, CASE kennt aber jeder DBA und dem gehört wohl auch die zukunft ;-)
Ilja