1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Bei Group By Anteile berechnen [MySQL]

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von HRGS85, 23 September 2014.

  1. HRGS85

    HRGS85 Benutzer

    Hi zusammen,

    ich habe folgende Abfrage:

    select status, sum(base_subtotal)
    from sales_flat_orderGroup by status

    die Abfrage gibt mir für jeden Statustypen die Summe der Nettoumsätze. Jetzt möchte ich für jeden Statustypen zusätzlich den Anteil am Gesamtumsatz wissen. Also die Umsätze hinter jedem Statustypen dividiert durch die gesamte Summe base_subtotal.

    Das Problem ist, dass ich die gesamte Summe base_subtotal nicht berechnen kann, wegen des Group by Statements. sum(base_subtotal) bezieht sich durch Group by schließlich nur auf die einzelnen Gruppe und nicht auf alle Zeilen...

    Hat da jemand eine Idee?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Meep.

    Du hast:

    Code:
    test=*# select * from hrgs ;
     status | val
    --------+-----
      1 |  10
      1 |  12
      1 |  22
      2 |  13
      2 |  15
      2 |  42
      3 |  2
      3 |  1
      3 |  5
    (9 rows)
    
    und willst

    Code:
    test=*# select distinct status, 100*(sum_per_status / sum_ueber_alles)::numeric(5,3) from (select status, (sum(val) over (partition by status))::numeric as sum_per_status, sum(val) over () as sum_ueber_alles from hrgs ) foo order by status;
     status | ?column?
    --------+----------
      1 |  36.100
      2 |  57.400
      3 |  6.600
    (3 rows)
    
    Oder? Also einfach, nur kurz noch MySQL gegen PostgreSQL getauscht und alles flutscht.
     
  3. Hony%

    Hony% Datenbank-Guru

    Hi.

    Auf die Schnelle hätte ich diesen Vorschlag:
    Code:
    SELECT status,
           SUM(base_subtotal) AS subtotal,
           SUM(base_subtotal) / (SELECT SUM(base_subtotal) FROM sales_flat_order)  AS anteil
    FROM sales_flat_order
    GROUP BY status
    Gruß
    Hony
     
    BerndB gefällt das.
  4. Hony%

    Hony% Datenbank-Guru

    Hier noch eine möglicherweise ressourcenschonendere Variante:

    Code:
    SELECT status,
           SUM(a.base_subtotal) AS subtotal,
           SUM(a.base_subtotal) / gesamt AS anteil
    FROM sales_flat_order AS a
    CROSS JOIN (SELECT SUM(base_subtotal) AS gesamt FROM sales_flat_order)
    GROUP BY status
     
    ukulele gefällt das.
  5. HRGS85

    HRGS85 Benutzer

    Perfekt, läuft ;)!

    Thx!!!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden