Benutzer mit den meisten Antworten
Summe aus einer Tabelle (datetime) und Bezeichnung aus eine andere Tabelle abfragen???

Frage
-
Hallo,
ich habe zwei Tabellen, Mitarbeiter und Termine. Jetzt möchte ich eine Abfrage machen, so dass als Ergebnis mir den Nachname aus Tabelle Mitarbeiter und die Summe der geleisteten Arbeitszeit (ende - start) aus Termine für jeweiligen Mitarbeiter geliefert wird. start und ende haben den Datentyp datetime.
Irgendwie bekomme ich es nicht hin. Wäre nett wenn jemand mir dabei helfen könnte.
Gruesse, NUNUI
- Bearbeitet Nunui Donnerstag, 28. Januar 2016 15:42
Antworten
-
Hi,
es ist immer sinnvoll und hilfreich, wenn Du deine Tabellenstrukturen als CREATE TABLE Statements, die Beispieldaten als INSERT INTO Statements und dazu dann das gewünschte Ergebnis in Tabellenform postest.
Da Du das nicht gemacht hast, hier mal ein Beispiel, welches nur bedingt auf deine Tabellen passt aber vom Grundsatz her deine Anforderung erfüllen würde.
SELECT m.Nachname, SUM( DATEDIFF( MINUTE, t.start, t.ende ) ) FROM Mitarbeiter m INNER JOIN Termine t ON m.ID = t.MitarbeiterId GROUP BY m.Nachname
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hi,
ok, ich hab übersehen, dass Du noch auf t.Start in der WHERE Klausel zugreifst.
Du musst dann natürlich noch dafür sorgen, dass auch die, bei denen t.Start NULL ist, auch mit reinkommen (das ist u.a. der Fall, wenn eben kein Termin für einen Mitarbeiter vorhanden ist)
SELECT m.Nachname, m.email SUM( DATEDIFF( MINUTE, t.start, t.ende ) ) FROM Mitarbeiter m LEFT JOIN Termine t ON m.ID = t.MitarbeiterId WHERE ( t.start IS NULL OR t.start >= CONVERT( DATETIME,'2016-01-01', 104 ) ) GROUP BY m.Nachname, m.email
BTW: Dein Statement dürfte gar nicht funktionieren, da bei dir eine schließende Klammer hinter , 104)) zuviel ist.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Nunui Freitag, 5. Februar 2016 18:20
Alle Antworten
-
Hi,
es ist immer sinnvoll und hilfreich, wenn Du deine Tabellenstrukturen als CREATE TABLE Statements, die Beispieldaten als INSERT INTO Statements und dazu dann das gewünschte Ergebnis in Tabellenform postest.
Da Du das nicht gemacht hast, hier mal ein Beispiel, welches nur bedingt auf deine Tabellen passt aber vom Grundsatz her deine Anforderung erfüllen würde.
SELECT m.Nachname, SUM( DATEDIFF( MINUTE, t.start, t.ende ) ) FROM Mitarbeiter m INNER JOIN Termine t ON m.ID = t.MitarbeiterId GROUP BY m.Nachname
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Danke für die Antwort. Genau so etwas habe ich gesucht.
Ich habe jetzt nur das Problem mit WHERE-Klausel! Wie und wo muss ich die Bedingung einsetzen, damit die Abfrage auch funktioniert?
(t.start >= CONVERT(DATETIME,'2016-01-01', 104))
Gruesse, NUNUI
-
Es muss wie folgt aussehen und es funktioniert auch mit WHERE-Klausel :o)
SELECT m.Nachname, SUM( DATEDIFF( MINUTE, t.start, t.ende ) ) FROM Mitarbeiter m INNER JOIN Termine t ON m.ID = t.MitarbeiterId WHERE t.start >= CONVERT(DATETIME,'2016-01-01', 104)) GROUP BY m.Nachname
DANKE für den Tip!!!
Gruesse, NUNUI
-
Hallo,
ich habe leider jetzt ein anderes Problem und nämlich, dass der Benutzer, der keine Termine hat gar nicht im Ergebnis vorkommt. Das ist mir wichtig, da ich ausser Summe der geleisteten Arbeitszeit auch Emailadresse abfragen möchte.
Wie kann ich das eigentlich machen? Meine Abfrage sieht jetzt wie folgt aus:
SELECT m.Nachname, m.email SUM( DATEDIFF( MINUTE, t.start, t.ende ) ) FROM Mitarbeiter m INNER JOIN Termine t ON m.ID = t.MitarbeiterId WHERE t.start >= CONVERT(DATETIME,'2016-01-01', 104)) GROUP BY m.Nachname, m.email
Gruesse, NUNUI
-
Hi,
ändere INNER JOIN in LEFT JOIN. Dann werden alle Datensätze aus der Tabelle "Mitarbeiter" und eben nur die verbundenen Werte aus "Termine" ausgelesen.
Beachte aber bitte, dass die Markierung als "Antwort" für die jeweilige Frage wichtig ist. Die nachträglich gestellte Frage hat mit der Ursprungsfrage ja nur bedingt etwas zu tun.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Freitag, 5. Februar 2016 17:28
-
Danke für die Antwort. Ich habe jetzt INNER JOIN in LEFT JOIN geändert, trotzdem werden die Benutzer, die keine Termine haben nicht ausgegeben.
SELECT m.Nachname, m.email SUM( DATEDIFF( MINUTE, t.start, t.ende ) ) FROM Mitarbeiter m LEFT JOIN Termine t ON m.ID = t.MitarbeiterId WHERE t.start >= CONVERT(DATETIME,'2016-01-01', 104)) GROUP BY m.Nachname, m.email
Ich habe die obige Beitrag wieder als Antwort markiert :o)
Gruesse, NUNUI
-
Hi,
ok, ich hab übersehen, dass Du noch auf t.Start in der WHERE Klausel zugreifst.
Du musst dann natürlich noch dafür sorgen, dass auch die, bei denen t.Start NULL ist, auch mit reinkommen (das ist u.a. der Fall, wenn eben kein Termin für einen Mitarbeiter vorhanden ist)
SELECT m.Nachname, m.email SUM( DATEDIFF( MINUTE, t.start, t.ende ) ) FROM Mitarbeiter m LEFT JOIN Termine t ON m.ID = t.MitarbeiterId WHERE ( t.start IS NULL OR t.start >= CONVERT( DATETIME,'2016-01-01', 104 ) ) GROUP BY m.Nachname, m.email
BTW: Dein Statement dürfte gar nicht funktionieren, da bei dir eine schließende Klammer hinter , 104)) zuviel ist.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Nunui Freitag, 5. Februar 2016 18:20
-
erstmal VIELEN DANK! Es funktioniert wunderbar :o)
Es sollte eigentlich wie folgt heissen, ich habe den öffnende Klammer vergessen gehabt :o)
SELECT m.Nachname, m.email SUM( DATEDIFF( MINUTE, t.start, t.ende ) ) FROM Mitarbeiter m LEFT JOIN Termine t ON m.ID = t.MitarbeiterId WHERE (t.start >= CONVERT(DATETIME,'2016-01-01', 104)) GROUP BY m.Nachname, m.email
Gruesse, NUNUI