none
Summe aus einer Tabelle (datetime) und Bezeichnung aus eine andere Tabelle abfragen??? RRS feed

  • 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
    Donnerstag, 28. Januar 2016 15:41

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

    • Als Antwort markiert Nunui Donnerstag, 28. Januar 2016 19:00
    • Tag als Antwort aufgehoben Nunui Freitag, 5. Februar 2016 16:59
    • Als Antwort markiert Nunui Freitag, 5. Februar 2016 17:37
    Donnerstag, 28. Januar 2016 17:02
    Moderator
  • 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
    Freitag, 5. Februar 2016 18:02
    Moderator

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

    • Als Antwort markiert Nunui Donnerstag, 28. Januar 2016 19:00
    • Tag als Antwort aufgehoben Nunui Freitag, 5. Februar 2016 16:59
    • Als Antwort markiert Nunui Freitag, 5. Februar 2016 17:37
    Donnerstag, 28. Januar 2016 17:02
    Moderator
  • 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

    Donnerstag, 28. Januar 2016 18:57
  • 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

    Donnerstag, 28. Januar 2016 19:04
  • 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

    Freitag, 5. Februar 2016 17:07
  • 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


    Freitag, 5. Februar 2016 17:27
    Moderator
  • 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

    Freitag, 5. Februar 2016 17:42
  • 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
    Freitag, 5. Februar 2016 18:02
    Moderator
  • 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

    Freitag, 5. Februar 2016 18:23