Sven: mySQL: Gleichzeitige Selektion mit Aggregatfunktionen

Hallo,

ich suche jetzt schon seit Tagen nach einer Lösung für folgendes Problem:

Ich habe eine (!) Tabelle, die folgendes enthält:

persnummer, monat, gewinn, kosten   (alles Integerwerte)

Ich möchte jetzt eine Selektion über die Tabelle machen, die mittlerweile 20 Mitarbeiter und 12 Monate enthält und ermitteln, in welchem Monat jeder Mitarbeiter seinen höchsten Gewinn erwirtschaftet und in Abhängigkeit dazu gleichzeitig (!!!) seine niedrigsten Kosten verursacht hat. Es nützt nichts, dass ich einen MIN() und einen MAX() Wert errechne, da dadurch sich nicht zwingend ein Datensatz ergibt, der genau einen Monat betrifft! Es soll also zunächst der maximale Gewinn gesucht werden (erste Suche) und in dieser Abhängigkeit dann alle Datensätze, die die kleinsten Kosten dazu enthalten).

Also:

SELECT MAX(gewinn) as gew, MIN(kosten) as kst, persnummer, monat FROM t GROUP BY persnummer

bringt nichts, da mySQL losgelöst von zusammenhängenden Datensätzen einfach die Maximal- bzw. Minimalwerte sucht.

+++

Beispielwerte anhand eines Mitarbeiters:

monat 1
gewinn 1000
kosten 200

monat 2
gewinn 1100
kosten 400

monat 3
gewinn 900
kosten 500

monat 4
gewinn 1200
kosten 500

monat 5
gewinn 1200
kosten 400

Ergebnis muss sein:

Monat 5, weil hier der Gewinn am höchsten ist und dazu die Kosten am niedrigsten....

Vom theoretischen Vorgehen stelle ich mir vor, dass zunächst ein SELECT nach MAX(gewinn) und personalnummer erfolgt und mit GROUP BY persnummer zusammengefasst wird.

Ich brauche nur den ersten Monat, falls es mehrere mit den selben Gewinn- und Kostendaten gibt!

Ich habe also soviele Datensätze wie ich Mitarbeiter habe.
Jetzt muss noch die zweite Abfrage erfolgen, die als Basis die erste hat und nochmals mit der gesamten Tabelle vergleicht...

Also ein SELECT MIN(kosten), persnummer, gewinn, monat FROM t WHERE ---Zwischenergebnis----

++++

Ich nutze folgendes:

Server Version: 5.0.32-Debian_7etch5
MySQL-Client-Version: 5.0.32

Ich kann keine VIEWs anlegen (nur so zur Info)....

Wie muss der Select-Befehl aussehen? Ich habe schon mit HAVING und JOIN rumprobiert, aber die Doku unter mysql.com ist eine Katastrophe...

Vielen Dank für Eure Hilfe!

  1. Hallo,

    statt mit Aggregatsfunktionen könntest du es ja mal mit Sortieren, Limit und einer korrelierenden Unterabfrage probieren.

    aber die Doku unter mysql.com ist eine Katastrophe...

    ach ja ... mysql selbst ist für mich bereits katastrophe genug ;)

    Cheers, Frank

    1. Hallo,

      statt mit Aggregatsfunktionen könntest du es ja mal mit Sortieren, Limit und einer korrelierenden Unterabfrage probieren.

      Hi Frank,

      und genau daran hakt es bei mir, insbesondere bei der korrelierenden Unterabfrage, die vermutlich notwendig ist....

      Hat noch jemand eine Idee?

      Viele Grüße

      Sven

      1. Hallo,

        » statt mit Aggregatsfunktionen könntest du es ja mal mit Sortieren, Limit und einer korrelierenden Unterabfrage probieren.

        und genau daran hakt es bei mir, insbesondere bei der korrelierenden Unterabfrage, die vermutlich notwendig ist....

        und welches Problem hast Du bei der korrelierenden Unterabfrage?

        Es ist recht einfach, mit einer korrelierenden Unterabfrage den maximalen Gewinn je Mitarbeiter sowie die dazugehörigen Spalten Monat und Kosten zu ermitteln. Wie Du es benötigst, werden mehrere Datensätze zurückgegeben, wenn der maximale Gewinn mehrfach erzielt wurde.

        Ganz analog kannst Du nun mit einer weiteren korrelierenden Unterabfrage aus dem Ergebnis der ersten Abfrage das Minimum der Kosten je Mitarbeiter ermitteln sowie die Werte der dazugehörigen Spalten Monat und Gewinn (ist ja eh' konstant). Erzielte der Mitarbeiter in mehreren Monaten gleichen und maximalen Gewinn bei gleichen und minimalen Kosten (für maximalen Gewinn), so erhältst Du mehr als einen Datensatz, was ja nicht verkehrt wäre.

        Du darfst die beiden Bedingungen nicht in der ersten Abfrage zusammenfassen, weil - wie Du bereits in Deinem Ausgangsbeitrag erwähntest - Du nur an den minimalen Kosten beim maximalen Gewinn interessiert bist und nicht an den minimalen Kosten je Mitarbeiter.

        Zu korrelierenden Unterabfragen hab' ich mal einen etwas ausführlicheren Beitrag erstellt.

        Freundliche Grüße

        Vinzenz