Klaus: (MySQL) Zwei Summen in einer Abfrage bilden möglich?

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:

  • art (enthält entweder A oder B)
  • menge (die Menge die summiert werden soll)
  • stelle (nach der gruppiert werden soll)

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

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

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

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

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

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

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

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

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

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

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