Mehrere Summen aus einer Tabelle ziehen
Kalle
- datenbank
0 suit0 Kalle0 Frank (no reg)0 Kalle
0 Frank (no reg)0 Kalle0 Frank (no reg)0 Kalle
Hallo,
entweder steh ich total auf dem Schlauch weil es unglaublich einfach ist, oder es ist überhaupt nicht möglich. Ich habe folgende (beispielhafte) Tabelle (MySQL 5):
KdNr | Kategorie | Wert |
---|---|---|
1 | A1 | 10 |
1 | A2 | 15 |
1 | B1 | 8 |
1 | B2 | 6 |
2 | A1 | 12 |
2 | A2 | 17 |
2 | B1 | 3 |
2 | B2 | 5 |
Ich brauche nun eine Abfrage, die mir die Werte aller A-Kategorien (also A1 und A2) sowie aller B-Kategorien (B1 und B2) getrennt summiert.
Das Ergenis sollte dann wunschgemäß so aussehen:
Kat | Summe |
---|---|
A | 54 |
B | 22 |
Am Aufbau der Quell-Tabelle lässt sich leider nichts ändern.
Ist das überhaupt machbar?
Vielen Dank schonmal im Voraus,
Kalle
Ist das überhaupt machbar?
UNION wird dir ggf helfen
Ist das überhaupt machbar?
UNION wird dir ggf helfen
Danke für den Hinweis. Mit UNION hatte ich bisher noch nichts zu tun und hab daher schon direkt was gelernt. Fein. Die Summen krieg ich nun also richtig her. Stimmt die Reihenfolge der Ergebnisse mit der Reihenfolge der SELECTS zwingend überein? Denn die Bezeichnung aus der ersten Spalte meiner "Wunschergebnistabelle" habe ich ja leider nicht, da ich ja nur die Spalten mit Titeln versehen kann, aber Zeilen eigentlich nicht.
Wenn zumindest A1 (statt A) da stehen würde, gäb's nen Anhaltspunkt. Lasse ich aber die Kategorien auch mit auswählen meckert er (verständlicherweise) wegen eines "Mixing of GROUP columns…". Ein GROUP BY Kategorie hintendran hat leider nicht geholfen.
Meine bisher funktionieren Abfrage sieht so aus:
SELECT SUM(Wert) FROM tabelle WHERE Kategorie = 'A1' OR Kategorie = 'A2'
UNION
SELECT SUM(Wert) FROM tabelle WHERE Kategorie = 'B1' OR Kategorie = 'B2'
Falls jemand noch mehr Tipps hat - ich bin bereit zu lernen.
Vielen Dank,
Kalle
SELECT SUM(Wert) FROM tabelle WHERE Kategorie = 'A1' OR Kategorie = 'A2'
UNION
SELECT SUM(Wert) FROM tabelle WHERE Kategorie = 'B1' OR Kategorie = 'B2'
Wie wär's mit
SELECT 'A' as Kategorie, SUM(Wert) as Summe FROM tabelle WHERE Kategorie = 'A1' OR Kategorie = 'A2'
UNION ALL -- UNION allein macht noch mal einen DISTINCT, was vielleicht nicht gewollt ist
SELECT 'BOderWasAuchImmerDuHierWillst' as Kategorie, SUM(Wert) as Summe FROM tabelle WHERE Kategorie = 'B1' OR Kategorie = 'B2'
... auch wenn ich diese Lösung für ein wenig "schräg" halte.
Frank
Hallo Frank,
das ganze ist nicht schräg sondern das was ich brauche ;-)
Das es so simpel ist hat mich hier wirklich schmunzeln lassen. Meine Probleme scheinen gelöst zu sein. Jetzt muss ich nur noch was aus den Ergebnissen machen bzw. prüfen wie zuverlässig das ganze ist oder ob da nicht doch irgendwo noch Haken sind die mir nachher meine Buchhaltung zerschiessen.
Vielen Dank und Grüße,
Kalle
Hallo,
Kategorie ist schätzungsweise ein varchar(xx) Feld. Dieses kannst du mit Zeichenkettenoperationen bearbeiten. LEFT('A1',1) ergäbe z.b. A und danach kannst du gruppieren (GROUP BY) wenn du summierst.
Also in etwa so:
SELECT LEFT(Kategorie,1) AS Kat,
SUM(Wert) AS Summe
FROM Quelltabelle
GROUP BY LEFT(Kategorie, 1)
ORDER BY LEFT(Kategorie, 1)
Ciao, Frank
Hallo,
Kategorie ist schätzungsweise ein varchar(xx) Feld. Dieses kannst du mit Zeichenkettenoperationen bearbeiten. LEFT('A1',1) ergäbe z.b. A und danach kannst du gruppieren (GROUP BY) wenn du summierst.
Also in etwa so:
SELECT LEFT(Kategorie,1) AS Kat,
SUM(Wert) AS Summe
FROM Quelltabelle
GROUP BY LEFT(Kategorie, 1)
ORDER BY LEFT(Kategorie, 1)
>
> Ciao, Frank
Hallo Frank,
Leider sind die Kategorien in meiner Arbeitstabelle nicht so simpel bezeichnet, so dass man da keine Anfangsbuchstaben zusammenfassen kann. Dein Posting hat mir jedoch bzgl. einer funkionierenden Gruppierung schonmal wiedergeholfen. Mein Problem diesbezüglich habe ich [hier](https://forum.selfhtml.org/?t=178391&m=1176279) beschrieben. Unsere Postings haben sich da zeitlich überschnitten.
Ich versuch mal die unterschiedlichen Kategorienamen mit REPLACE sozusagen gleichzusetzten und dann zu gruppieren. Evtl. klappt's ja.
Viele Grüße,
Kalle
Leider sind die Kategorien in meiner Arbeitstabelle nicht so simpel bezeichnet,
Das kann ich aber hier nicht wissen. Vielleicht hättest du mal einen Original-Kategorienamen und das gewünschte Ergebnis hingeschrieben, statt die Tatsachen so zu verschleiern.
Ausser LEFT() gibt's auch noch n genügend weitere Zeichenkettenfunktionen, Reguläre Ausdrücke gehen vielleicht auch?
Wenn du aber sowas kompliziertes vorhast, gebe ich mal den Tipp ab: Dein Datenmodell ist suboptimal. Du könntest die Kategorien ausnormalisieren.
Frank
Leider sind die Kategorien in meiner Arbeitstabelle nicht so simpel bezeichnet,
Das kann ich aber hier nicht wissen. Vielleicht hättest du mal einen Original-Kategorienamen und das gewünschte Ergebnis hingeschrieben, statt die Tatsachen so zu verschleiern.
Ausser LEFT() gibt's auch noch n genügend weitere Zeichenkettenfunktionen, Reguläre Ausdrücke gehen vielleicht auch?
Wenn du aber sowas kompliziertes vorhast, gebe ich mal den Tipp ab: Dein Datenmodell ist suboptimal. Du könntest die Kategorien ausnormalisieren.
Frank
Hallo Frank,
am Datenmodell kann ich leider nichts ändern, da das ganze eine osCommerce-Datenbank ist und da schon Unmengen an Datensätzen vorhanden sind. Würde ich das tun, so müsste ich vermutlich nochmal mit 'ne leeren Datenbank starten und das ShopSystem umprogrammieren. Das ist grade bei 'nem OpenSource Shop nicht unbedingt praktikabel.
Ich hab in meinem Eingangsposting versucht das ganze suzusagen auf die kleinste Ebene runterzubrechen, damit ich das Essentielle lernen/verstehen kann und damit potentielle Hilfesteller sich nicht mit Unmengen von Bezeichnugen rumschlagen müssen. Es kommen auch noch ein paar JOINs mit rein und hätte ich mein reales Problem geschildert, so wäre vermutlich an mehreren Baustellen gleichzeitig gearbeitet worden.
Ich bin dank Deine Hinweise aber ein gutes Stück weiter gekommen und war nun auch in der Situation mir mal anzuschauen was MySQL alles an Stringoperationen zu bieten hat - ich bin erstaunt und werde da in nächster Zeit mal ein bisschen rumspielen um zu sehen was alles geht und wo ich's nutzen kann.
Viele Grüße,
Kalle