Join mit MAX Verwenden

siffkroete

Benutzer
Beiträge
17
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?
 
Werbung:
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?
 
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.
 
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
 
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?
 
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."
 
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;
 
Werbung:
Zurück
Oben