Frage zu einer MSSQL Abfrage - gruppieren?

samke

Mitglied
Hallo,

Ich habe zwei Tabellen...
Tabelle 1 - Name: ID, Name
Tabelle 2 - Eintraege: ID, NameID, Betreff, Datum

Ich möchte folgendes erreichen. Es sollen alle Namen aufgelistet werden. Zu den Namen soll das Datum vom letzten Eintrag von der Eintraege Tabelle (von dem jeweiligen Namen) angezeigt werden.

Sprich: Name, Betreff, Datum -> (Betreff und Datum basiert auf den letzten Eintrag vom jeweiligen Namen)

Wie muss ich das jetzt in MSSQL Abfragen. Ich dachte mir das wie folgt, allerdings funktioniert das nicht so.

SELECT Name.ID, Name.Name, Eintraege.NameID, Eintraege.Betreff, Eintraege.Datum
FROM Name
LEFT JOIN Eintraege ON Eintraege.NameID = Name.ID
ORDER BY Eintraege.Datum DESC
GROUP BY Eintraege.NameID

Kann mir da einer helfen und sagen was ich falsch mache?

Danke
Gruß
 
SQL:
Select t1.id , t1.name , max(t2.Datum) as Letzer Zugriff
From Name as t1 inner Join Einträge t2. on t1.ID = t2.NameID
Group by t1.id, t1.Name

Grüsse bb
 
Zuletzt bearbeitet von einem Moderator:
Hallo, danke für die Antwort. Leider erhalte ich dann aber eine Fehlermeldung, mit der ich nichts anfangen kann.

[Microsoft][ODBC SQL Server Driver][SQL Server]Die "Tabelle"."Feld"-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.

Kann mir da einer sagen, was an dem Code noch falsch ist?


Gruß
 
aaahhhhh, jetzt hab ich es hin. Man muss - wie im Beispiel von brainbyte - nach ID und Name gruppieren.

Es funktioniert zwar, allerdings ferstehe ich noch nicht ganz, warum ich beides gruppieren muss. Die ID ist doch eindeutig, warum dann auch noch mal nach den Namen?

Kurze Info wäre nett.
 
Durch den Join ist die ID nicht mehr eindeutig.

Für jeden eintrag in T2 bekommst du erst einmal einen eintrag aus tabelle 1 und um die Aggregation auszuführen musst du dann natürlich gruppieren
 
Moin Moin,

Durch den Join ist die ID nicht mehr eindeutig.

Für jeden eintrag in T2 bekommst du erst einmal einen eintrag aus tabelle 1 und um die Aggregation auszuführen musst du dann natürlich gruppieren

Ok, das eindeutige Werte nicht doppelt vorkommen dürfen und daher gruppiert werden müssen leuchtet ein. Allerdings frage ich auch die "EintragsArt" ab (Inhalt z.B. per Web, per Telefon usw.). Ich bekomme jetzt allerdings nur ein Ergebnis, wenn ich diese Spalte auch gruppiere - allerdings ist dann das Ergebnis falsch (der Wert aus EintragsArt passt nicht zum Eintrag selber). Der Inhalt der EintragsArt muss ja nicht einmalig wie eine ID sein.

Warum ist das so? Bzw. was mache ich da falsch?
 
Hallo samke,

wenn du zu Name und Betreff das neuste Datum haben möchtest, dann so:
Erst die Datensätze gruppiert aus Eintraege holen und dann joinen.
Code:
SELECT     Name.ID, Name.Name, Eintraege.Betreff, Eintraege.Datum
FROM         Name INNER JOIN
                          (SELECT     NameID, Betreff, MAX(Datum) AS Datum
                            FROM          Eintraege AS Eintraege_1
                            GROUP BY NameID, Betreff) AS Eintraege ON Name.ID = Eintraege.NameID
Wenn du jeden Namen nur einmal möchtest, mit letztem Datum und zugehörigen Betreff, dann so:
Code:
SELECT     Name.ID, Name.Name, Eintraege.Betreff, Eintraege.Datum
FROM         Name INNER JOIN
                          (SELECT     Eintraege_2.NameID, Eintraege_2.Datum, Eintraege_2.Betreff
                            FROM          Eintraege AS Eintraege_2 INNER JOIN
                                                       (SELECT     NameID, MAX(Datum) AS Datum
                                                         FROM          Eintraege AS Eintraege_1
                                                         GROUP BY NameID) AS Eintraege1 ON Eintraege_2.NameID = Eintraege1.NameID AND Eintraege_2.Datum = Eintraege1.Datum) 
                      AS Eintraege ON Name.ID = Eintraege.NameID
So bekommst du auch die Eintragesart zu dem entsprechenden Datum und Betreff:
Code:
SELECT     Name.ID, Name.Name, Eintraege.Betreff, Eintraege.Datum, Eintraege.Art
FROM         Name INNER JOIN
                          (SELECT     Eintraege_2.NameID, Eintraege_2.Datum, Eintraege_2.Betreff, Eintraege_2.Art
                            FROM          Eintraege AS Eintraege_2 INNER JOIN
                                                       (SELECT     NameID, MAX(Datum) AS Datum
                                                         FROM          Eintraege AS Eintraege_1
                                                         GROUP BY NameID) AS Eintraege1 ON Eintraege_2.NameID = Eintraege1.NameID AND Eintraege_2.Datum = Eintraege1.Datum) 
                      AS Eintraege ON Name.ID = Eintraege.NameID
 
Zurück