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

Join mit MAX Verwenden

Dieses Thema im Forum "Microsoft Access" wurde erstellt von siffkroete, 14 März 2016.

  1. siffkroete

    siffkroete Benutzer

    Hi Leute

    Ich habe 2 Tabellen: Mitarbeiter -> Pensum (1->n). Ein Mitarbeiter hat verschiedene Pensen je nach Datum.
    Jetzt möchte ich wissen welches Pensum gilt für welchen Mitarbeiter aktuell. Es soll also den Datensatz liefern mit Datum kleiner gleich 2016.03.14. Was aber wenn mehrere Daten kleiner als 2016.03.14 sind? Dann soll es das nächst aktuellste Datum ausgeben. Also MAX(Alle Daten<=2016.03.14). Ich habe es folgenderweise versucht:

    SELECT Mitarbeiter.Name,Mitarbeiter.Vorname, Pensum.AnzahlStunden, MAX(Pensum.Datum)
    FROM Mitarbeiter INNER JOIN Pensum
    WHERE Datum<='2016.03.14';

    Leider wird das Maximum von der ganzen Komplementärmenge Name,Vorname X Pensum, Datum herausgegeben und nicht das Maximum für jeden Mitarbeiter. Das ist nur ein Datensatz. Ich will aber für jeden Mitarbeiter ein Datensatz mit dem aktuellen Pensum. Was tun? Kann man irgenwie JOIN mit MAX kombinieren?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Dein gezeigtes SQL ist syntaktisch falsch, hast Du da etwas aus Versehen MySQL am Start?

    Du hast:

    Code:
    test=*# select * from mitarbeiter ;
     id |  name
    ----+---------------
      1 | mitarbeiter 1
      2 | mitarbeiter 2
      3 | mitarbeiter 3
      4 | mitarbeiter 4
      5 | mitarbeiter 5
    (5 rows)
    
    test=*# select * from pensum ;
     ma_id |  datum  | pensum
    -------+------------+--------
      1 | 2016-03-12 |  81
      1 | 2016-03-13 |  2
      1 | 2016-03-14 |  97
      1 | 2016-03-15 |  83
      1 | 2016-03-16 |  35
      1 | 2016-03-17 |  73
      2 | 2016-03-12 |  24
      2 | 2016-03-13 |  51
      2 | 2016-03-14 |  66
      2 | 2016-03-15 |  65
      2 | 2016-03-16 |  23
      2 | 2016-03-17 |  51
      3 | 2016-03-12 |  0
      3 | 2016-03-13 |  20
      3 | 2016-03-14 |  8
      3 | 2016-03-15 |  58
      3 | 2016-03-16 |  28
      3 | 2016-03-17 |  33
      4 | 2016-03-12 |  66
      4 | 2016-03-13 |  81
      4 | 2016-03-14 |  82
      4 | 2016-03-15 |  83
      4 | 2016-03-16 |  76
      4 | 2016-03-17 |  63
      5 | 2016-03-12 |  73
      5 | 2016-03-13 |  26
      5 | 2016-03-14 |  18
      5 | 2016-03-15 |  81
      5 | 2016-03-16 |  44
      5 | 2016-03-17 |  70
    (30 rows)
    
    und suchst scheinbar:

    Code:
    test=*# select ma.name, p.* from mitarbeiter ma left join (select distinct on (ma_id) ma_id, datum, pensum from pensum where datum >= current_date order by ma_id, datum) p on ma.id=p.ma_id;
      name  | ma_id |  datum  | pensum
    ---------------+-------+------------+--------
     mitarbeiter 1 |  1 | 2016-03-14 |  97
     mitarbeiter 2 |  2 | 2016-03-14 |  66
     mitarbeiter 3 |  3 | 2016-03-14 |  8
     mitarbeiter 4 |  4 | 2016-03-14 |  82
     mitarbeiter 5 |  5 | 2016-03-14 |  18
    (5 rows)
    
    
    Oder?
     
  3. siffkroete

    siffkroete Benutzer

    Hi
    Danke für die Antwort, sie hat mich auf Ideen gebracht die ich vorher nicht hatte. Jedoch funktioniert der Code bei mir so nicht. Hast es in Microsoft Access versucht? Auch geht bei mir nicht:
    SELECT Mitarbeiter.Name, Mitarbeiter_Soll_Arbeitszeit.Gueltig_Ab
    FROM Mitarbeiter AS ma
    INNER JOIN
    (SELECT DISTINCT Mitarbeiter_ID, Gueltig_Ab, Anstellungs_Prozent FROM Mitarbeiter_Soll_Arbeitszei) AS masa
    WHERE Gueltig_Ab<=[Geben Sie Datum ein:]
    ON ma.Mitarbeiter_ID=masa.Mitarbeiter_ID;

    Was ist daran falsch? Die 2 Relationen die am INNER JOIN teilnehmen, dürfen doch mit SELECT zuerst hergestellt werden oder? Ich habe das Ganze in vereinfachter Version versucht und es geht trotzdem nicht.
     
  4. ukulele

    ukulele Datenbank-Guru

    Probier mal sowas hier:
    Code:
    SELECT   ma.name,
         p1.datum,
         p2.pensum
    FROM   mitarbeiter ma
    LEFT JOIN   (   SELECT   ma_id,
                 max(datum)
             FROM   pensum
             WHERE   datum <= [Geben Sie Datum ein:]
             GROUP BY ma_id ) p1
    ON     ma.id = p1.ma_id
    LEFT JOIN pensum p2
    ON     ma.id = p2.ma_id
    AND     p1.datum = p2.datum
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Nein.
     
  6. siffkroete

    siffkroete Benutzer

    Die Max-Funktion funktioniert bei mir gar nicht, egal wie ich es versuche. Ich bin ganz verzweifelt! Funktioniert den in dem verdammten scheiss ms access nichts was sonst überall funktioniert?
     
  7. ukulele

    ukulele Datenbank-Guru

    siffkroete gefällt das.
  8. siffkroete

    siffkroete Benutzer

    Funktioniert bei mir auch nicht:
    SELECT Mitarbeiter.Name, Max(Mitarbeiter_Soll_Arbeitszeit.Gueltig_Ab) AS maxMasa
    FROM Mitarbeiter, Mitarbeiter_Soll_Arbeitszeit
    WHERE Mitarbeiter_Soll_Arbeitszeit.Gueltig_Ab<=[Geben Sie ein Datum ein:]
    AND Mitarbeiter.Mitarbeiter_ID = Mitarbeiter_Soll_Arbeitszeit.Mitarbeiter_ID
    ORDER BY Mitarbeiter.Name ASC, Mitarbeiter.Vorname ASC;

    In dem Tutorial oben steht es so, aber es funktioniert nicht! Es kommt: "Sie wollten eine Abfrage ausführen, die den angebenen Ausdruck 'Name' nicht als Teil der Aggregatfunktion einschliesst."
     
  9. ukulele

    ukulele Datenbank-Guru

    Das ist auch syntaktisch falsch, jede Spalte muss aggregiert oder gruppiert werden. Bei dir fehlt das GROUP BY Mitarbeiter.Name
    Code:
    SELECT Mitarbeiter.Name, Max(Mitarbeiter_Soll_Arbeitszeit.Gueltig_Ab) AS maxMasa
    FROM Mitarbeiter, Mitarbeiter_Soll_Arbeitszeit
    WHERE Mitarbeiter_Soll_Arbeitszeit.Gueltig_Ab<=[Geben Sie ein Datum ein:]
    AND Mitarbeiter.Mitarbeiter_ID = Mitarbeiter_Soll_Arbeitszeit.Mitarbeiter_ID
    GROUP BY Mitarbeiter.Name
    ORDER BY Mitarbeiter.Name ASC, Mitarbeiter.Vorname ASC;
     
    siffkroete gefällt das.
  10. siffkroete

    siffkroete Benutzer

    Hi
    Vielen Dank. Der letzte Beitrag hat geholfen. Group By ist schon ne coole Sache.
     
  11. siffkroete

    siffkroete Benutzer

    Vielen Dank!
    Der letzte Beitrag hat geholfen, es scheint zu klappen. Group By ist schon ne tolle Sache.
     
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