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

MAX-Wert nach einem GROUP BY ermitteln

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von DerMaddin, 21 Februar 2019.

  1. DerMaddin

    DerMaddin Neuer Benutzer

    Hallo,

    ich habe zwei Tabellen TEAM und MITARBEITER, wobei ein Mitarbeiter genau einem Team zugeordnet ist (1:n)

    Tabelle TEAM
    - tid (Primärschlüssel)
    - bezeichnung

    Tabelle MITARBEITER
    - mid (Primärschlüssel)
    - vorname
    - nachname
    - umsatz
    - tid (Fremdschlüssel --> Tabelle TEAM)

    Ziel: Ich möchte das Team mit dem höchsten Umsatz (= Summe aller Einzelumsätze der Mitarbeiter) ausgeben.
    In meiner SQL-Abfrage bilde ich zunächst die Summe der Umsätze aller Mitarbeiter eines Teams (SUM) und gruppiere diese
    nach Teams. --> Das funktioniert [​IMG]

    ABER wie bekomme ich dann das Team mit dem höchsten Umsatz?

    SELECT t.name, SUM(m.umsatz) AS teamumsatz
    FROM team t
    JOIN mitarbeiter m
    ON t.tid = m.tid
    GROUP BY t.tid
    HAVING ???

    Ich weiß, dass ich hier ein HAVING mit einem Sub-Select brauche, komme aber nicht weiter.

    Kann mir da jemand helfen?

    Danke & Gruß
    Der Maddin
     
  2. akretschmer

    akretschmer Datenbank-Guru

    order by und limit 1
     
  3. DerMaddin

    DerMaddin Neuer Benutzer

    Hallo,

    sorry, ich hätte dazu schreiben sollen, dass ich diesen Versuch schon unternommen hatte.
    Problem dabei: Wenn es zwei gleiche höchste Werte gibt, schneidet "Limit 1" einen davon ab.

    Aber dennoch: Vielen Dank für Deine Hilfe :)

    Maddin
     
  4. akretschmer

    akretschmer Datenbank-Guru

    erstelle erst einmal die aufsummierten Umsätze je Team. Angenommen, das sieht so aus.

    Code:
    test=*# select * from team ;
     id | umsatz
    ----+--------
      1 |     20
      2 |     20
      3 |     10
    (3 rows)
    
    
    Damit kannst Du dann rank() nutzen:

    Code:
    test=*# select id, rank() over (order by umsatz desc) from team order by umsatz desc;
     id | rank
    ----+------
      1 |    1
      2 |    1
      3 |    3
    (3 rows)
    
    und weiter dann:

    Code:
    test=*# with r as (select id, rank() over (order by umsatz desc) from team order by umsatz desc) select * from r where rank = 1;
     id | rank
    ----+------
      1 |    1
      2 |    1
    (2 rows)
    
     
  5. DerMaddin

    DerMaddin Neuer Benutzer

    Prima, vielen Dank :)
    Ich versuche mal, ob ich das in ein SQL-Statement bekomm.

    Maddin
     
  6. akretschmer

    akretschmer Datenbank-Guru

    der Part ist nun Deine Hausaufgabe ;-)
     
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