klawischnigg: In mysql Summe von Summen aus Unterabfragen bilden

Hi there,

ich steh schon seit Stunden auf dem Schlauch:

ich versuch seit geraumer Zeit die Summe von Summen zu bilden, die sich aus Unterabfragen ergeben.

select * from (

select sum(r1) from table as T1 where bedingung1
UNION
select sum(r2) from table as T2  where bedingung2
UNION
select sum(r3) from table as T3  where bedingung3
UNION
select sum(r4) from table as T4  where bedingung4
UNION
select sum(r5) from table as T5  where bedingung5

) as XYZ


erzeugt mir (zB in phpmyadmin) brav eine Spalte mit 5 verschiedenen Summen. Da steht dann zB:

sum(r1)

244

142

-17

24

91

Jetzt will ich aber nur die Summe dieser Summen, einfach in dem Fall die Zahl 484, das ist das einzige was mich interessiert, also quasi statt eines


select * from ...

ein


select sum(*) from ...

was natürlich von der Syntax her nicht funktioniert. Wie muß ich das notieren, oder bin ich da komplett auf dem Holzweg? Funktioniert das überhaupt mit einer SQL-Anweisung oder ist es gescheiter, wenn ich etwas drum herum programmier? (Das wäre natürlich ein Kinkerlitzchen, aber ich wollt's einfach "eleganter" lösen...;)

Thnx in Advance...

  1. Hallo,

    gibt elegantere Wege, aber so dürfte es auch funktionieren:

    select sum(x.y) from 
    
    (
    
    select sum(r1) from table as y where bedingung1
    UNION
    select sum(r2) from table as y  where bedingung2
    UNION
    select sum(r3) from table as y  where bedingung3
    UNION
    select sum(r4) from table as y  where bedingung4
    UNION
    select sum(r5) from table as y  where bedingung5
    
    )
    x;
    

    ungetestet.

    lg.

    1. Tach!

      select sum(x.y) from 
      
      (
      
      select sum(r1) from table as y where bedingung1
      UNION
      select sum(r2) from table as y  where bedingung2
      UNION
      select sum(r3) from table as y  where bedingung3
      UNION
      select sum(r4) from table as y  where bedingung4
      UNION
      select sum(r5) from table as y  where bedingung5
      
      )
      x;
      

      Das y in x.y muss ein Spaltenname/-alias sein, kein Alias einer Tabelle. Der Alias muss ans Feld und das x. braucht man bei einer einzelnen Query nicht (nur das x als Alias hinter der Subquery).

      dedlfix.

      1. Hallo,

        Das y in x.y muss ein Spaltenname/-alias sein, kein Alias einer Tabelle. Der Alias muss ans Feld und das x. braucht man bei einer einzelnen Query nicht (nur das x als Alias hinter der Subquery).

        ok. Aber wenn es falsch ist, dürfte es doch nicht funktionieren? Tut es aber.

        lg.

        1. Hallo Lisa,

          wo funktioniert es? Ich habe es gerade auf MS SQL Server (2012) und MySQL (5.6) ausprobiert, da kann ich keine Table Aliase summieren.

          Rolf

          --
          sumpsi - posui - clusi
          1. Hallo,

            wo funktioniert es? Ich habe es gerade auf MS SQL Server (2012) und MySQL (5.6) ausprobiert, da kann ich keine Table Aliase summieren.

            mal kurz geprüft, sollte gehen:

            Bitte mal das hier aufrufen. Dann das Sql-Statement tauschen gegen:

            SELECT SUM(Quantity) AS TotalItemsOrdered FROM OrderDetails
            union
            SELECT SUM(CustomerID) AS y FROM Orders;   
            

            Ergebnis:

            Number of Records: 2
            TotalItemsOrdered
            51317
            38534

            Da aber ja diese auch noch summiert sein sollen, nochmal sql tauschen:

            select sum(x.y) from (
            
            SELECT SUM(Quantity) AS y FROM OrderDetails
            union
            SELECT SUM(CustomerID) AS y FROM Orders
            )x;  
            

            Ergebnis:
            Number of Records: 1
            sum(x.y)
            89851

            Entspricht das nicht dem was ich gepostet habe, oder habe ich einen Denkfehler?

            lg.

            1. Hallo Lisa,

              oder habe ich einen Denkfehler?

              Vielleicht einen Kopierfehler. Oder Du warst um 10 vor 5 noch nicht ganz wach. Was Du jetzt vorstellst, legt den Alias y auf die Column, also das, was Dedlfix als notwendig beschrieb.

              Was Du vorher vorgestellt hast, legte den Alias y auf die Table, und das ist was anderes.

              Also Fazit: Wir sind uns alle einig, wie es gehen sollte :)

              Rolf

              --
              sumpsi - posui - clusi
              1. Hallo,

                Vielleicht einen Kopierfehler. Oder Du warst um 10 vor 5 noch nicht ganz wach. Was Du jetzt vorstellst, legt den Alias y auf die Column, also das, was Dedlfix als notwendig beschrieb.

                Ach je, stimmt ja... hatte das beim Copy vom OP übersehen, und ja die Uhrzeit war auch schon fortgeschritten. Wollte auch erst gar nicht antworten, aber nachdem der OP schon 3 Std. keine Antwort hatte, dachte ich "mach mal schnell".

                Ob so was dann direkt, wegen einem kleinen Dreher, einen Minuspunkt verdient hat, ist dann wieder eine andere Sache.

                Was Du vorher vorgestellt hast, legte den Alias y auf die Table, und das ist was anderes.

                Ja, danke.

                lg.

                1. Hallo Lisa,

                  das Minus bedeutet "hilft so nicht" - und es gilt für diesen einen Beitrag, nicht für Dich als Person. Es ist jedenfalls nicht von mir gekommen. Da Du ohne Login geschrieben hast, kann es Dir ja auch nicht dauerhaft zugerechnet werden und es lohnt nicht, sich darüber aufzuregen. Schreibst Du für die Community oder für ein Punktekonto?

                  Rolf

                  --
                  sumpsi - posui - clusi
                  1. Hallo,

                    das Minus bedeutet "hilft so nicht" - und es gilt für diesen einen Beitrag, nicht für Dich als Person. Es ist jedenfalls nicht von mir gekommen. Da Du ohne Login geschrieben hast, kann es Dir ja auch nicht dauerhaft zugerechnet werden und es lohnt nicht, sich darüber aufzuregen. Schreibst Du für die Community oder für ein Punktekonto?

                    Dann würde ich mich öfter einloggen, Punkte interessieren mich kaum. Nein, es geht mir hier eher ums Prinzip, wenn diese Vorgehensweise "hilft so nicht" oder "sollte man so nicht machen" automatisch Minuspunkte bekäme anstatt Korrektur, wäre das sicher nicht gut für die Motivation aber zumindest ein einheitliches Schema. Da sich hier aber meist die Verfahrensweise heraus kristallisiert hat, richtige Antworten positiv zu bewerten, gelten andere Antworten damit zwangsläufig als nicht optimal oder falsch, wobei falsch ja oft auch ein relativer Begriff ist. Aber zum Punkt zu kommen, nein der Minuspunkt stört mich nicht als Person, sondern eher, dass vielleicht der OP oder ein anderer das erst gar nicht beachtet und somit vielleicht gar nicht erkennt, dass es ihm helfen (auch wenn falsch herum) könnte.

                    lg.

  2. Tach!

    
    select sum(*) from ...
    
    

    was natürlich von der Syntax her nicht funktioniert.

    Gib der SUM()-Spalte in der erste Unterabfrage einen Alias und den dann auch beim SUM(alias) an. Lediglich die erste Abfrage braucht den Alias, die weiteren unionisierten Selects ordnen sich mit ein.

    dedlfix.

    1. Hi there,

      danke, auch an die übrigen Beteiligten, hat funktioniert...