Kalle: Mehrere Summen aus einer Tabelle ziehen

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

  1. Ist das überhaupt machbar?

    UNION wird dir ggf helfen

    1. 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

      1. 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

        1. 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

  2. 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

    1. 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
      
      1. 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

        1. 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