Benutzer mit den meisten Antworten
Suche nach kleinstem und größtem Zeitwert pro Tag

Frage
-
Hallo,
ich habe eine Abfrage, die über mehrere Tabellen hinweg geht:
SELECT DISTINCT LK.Nr AS Nr, KAL.DatAnfang AS Beginn, KAL.DatEnde AS Ende, (datepart(hour, (KAL.DatEnde-KAL.DatAnfang))*60) + datepart(MINUTE, (KAL.DatEnde-KAL.DatAnfang)) AS Minuten FROM Lehrkraft AS LK JOIN MassnahmenTN AS MTN ON MTN.Lehrkraft = LK.LehrkraftNr JOIN Kalender AS KAL ON KAL.TNRec = MTN.TNRec WHERE (MTN.MassnahmeNr LIKE 'Schule1')
Dabei erhalte ich folgendes Ergebnis (im Auszug):
Nr Beginn Ende Minuten 193 2013-08-21 17:00:00.000 2013-08-21 19:15:00.000 135 193 2013-08-23 16:00:00.000 2013-08-23 18:15:00.000 135 193 2013-09-04 16:00:00.000 2013-09-04 18:15:00.000 135 193 2013-09-04 17:00:00.000 2013-09-04 19:15:00.000 135 193 2013-09-04 17:30:00.000 2013-09-04 19:45:00.000 135 193 2013-09-04 17:45:00.000 2013-09-04 20:00:00.000 135 193 2013-09-06 14:00:00.000 2013-09-06 16:15:00.000 135 204 2013-11-11 15:00:00.000 2013-11-11 18:00:00.000 180 204 2013-11-11 15:15:00.000 2013-11-11 18:15:00.000 180 204 2013-11-11 15:30:00.000 2013-11-11 17:45:00.000 135 204 2013-11-12 11:30:00.000 2013-11-12 13:45:00.000 135
Man kann sehen, dass die selbe Person an einem Tag mehrere Eintragungen hatte, die sich auch überschneiden dürfen.
Wie kann man nun die Abfrage so gestalten, dass entweder in jeder Zeile den früheste Beginn und das späteste Ende pro Tag darstellt oder jeden Tag zusammenfasst und dann den frühesten und spätesten aufführt.
Im Fall oben also:
Nr Beginn Ende Minuten 193 2013-08-21 17:00:00.000 2013-08-21 19:15:00.000 135 193 2013-08-23 16:00:00.000 2013-08-23 18:15:00.000 135 193 2013-09-04 16:00:00.000 2013-09-04 20:00:00.000 240 193 2013-09-06 14:00:00.000 2013-09-06 16:15:00.000 135 204 2013-11-11 15:00:00.000 2013-11-11 18:15:00.000 195 204 2013-11-12 11:30:00.000 2013-11-12 13:45:00.000 135
Sollte das nicht gehen, muss ich eine Lösung in Excel finden. Die das aus der oberen Tabelle erzeugt.
Ich bin dankbar für jeden Tipp :)
Mario
Antworten
-
Hallo Mario, schau Dir mal dies Beispiel an:
Declare @Daten as Table(Nr integer, Beginn datetime, Ende datetime, Minuten integer); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130821 17:00:00.000', '20130821 19:15:00.000', 135); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130823 16:00:00.000', '20130823 18:15:00.000', 135); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130904 16:00:00.000', '20130904 18:15:00.000', 135); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130904 17:00:00.000', '20130904 19:15:00.000', 135); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130904 17:30:00.000', '20130904 19:45:00.000', 135); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130904 17:45:00.000', '20130904 20:00:00.000', 135); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130906 14:00:00.000', '20130906 16:15:00.000', 135); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (204, '20131111 15:00:00.000', '20131111 18:00:00.000', 180); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (204, '20131111 15:15:00.000', '20131111 18:15:00.000', 180); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (204, '20131111 15:30:00.000', '20131111 17:45:00.000', 135); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (204, '20131112 11:30:00.000', '20131112 13:45:00.000', 135); With NumberedRows as ( Select Nr, Min(Beginn) as Start, Max(Ende) as Ende from @Daten group by Nr, cast(Beginn as date) ) Select Nr, Start, Ende, Datediff(MINUTE, Start, Ende) as Minuten from NumberedRows order by Nr, Start ;
HTH!
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu- Als Antwort vorgeschlagen Christoph MuthmannEditor Montag, 31. März 2014 08:26
- Als Antwort markiert Christoph MuthmannEditor Montag, 31. März 2014 12:47
Alle Antworten
-
Hallo Mario, schau Dir mal dies Beispiel an:
Declare @Daten as Table(Nr integer, Beginn datetime, Ende datetime, Minuten integer); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130821 17:00:00.000', '20130821 19:15:00.000', 135); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130823 16:00:00.000', '20130823 18:15:00.000', 135); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130904 16:00:00.000', '20130904 18:15:00.000', 135); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130904 17:00:00.000', '20130904 19:15:00.000', 135); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130904 17:30:00.000', '20130904 19:45:00.000', 135); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130904 17:45:00.000', '20130904 20:00:00.000', 135); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130906 14:00:00.000', '20130906 16:15:00.000', 135); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (204, '20131111 15:00:00.000', '20131111 18:00:00.000', 180); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (204, '20131111 15:15:00.000', '20131111 18:15:00.000', 180); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (204, '20131111 15:30:00.000', '20131111 17:45:00.000', 135); Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (204, '20131112 11:30:00.000', '20131112 13:45:00.000', 135); With NumberedRows as ( Select Nr, Min(Beginn) as Start, Max(Ende) as Ende from @Daten group by Nr, cast(Beginn as date) ) Select Nr, Start, Ende, Datediff(MINUTE, Start, Ende) as Minuten from NumberedRows order by Nr, Start ;
HTH!
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu- Als Antwort vorgeschlagen Christoph MuthmannEditor Montag, 31. März 2014 08:26
- Als Antwort markiert Christoph MuthmannEditor Montag, 31. März 2014 12:47
-
So war das Beispiel auch nicht gedacht!
Packe Dein ursprüngliches Select in eine CTE (Common Table Expression) (siehe NumberedRows in meinem Beispiel) und verwende diese CTE als Input für meine CTE.
Fertig!
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu -
Hallo und vielen Dank,
das Konstrukt mit CTE war mir bisher nicht bekannt, läuft aber.
Da es sehr viele Zeilen sind, konnte ich noch nicht abschließend klären, ob wirklich alle Daten korrekt sind, aber die Tabelle wurde von 6000 auf ca. 1700 Zeilen eingedampft. :)
Bye,
Mario