Zwei Zeilen in einer zusammenfassen

logan517

Benutzer
Beiträge
14
Hallo,

ein vorhandenes Programm schreibt in eine Tabelle ein art Benutzerprotokoll, was der Nutzer macht und unter anderem auch wann er sich an- und abgemeldet hat.
Ich möchte mir gerne aus dieser Tabelle auslesen wann das gewesen ist und wie lange der Nutzer angemeldet war.
Mein Problem dabei ist, es wird für jede Aktion ein Datensatz geschrieben. Ich habe also pro Benutzer immer mindestens 2.
So sieht die Tabelle in etwa aus, ich habe diese mal nachgebaut:
protokollTabelle_vorher.png
Und so hätte ich das gerne:
protokollTabelle_nachher.png

Meine erste Idee geht in diese Richtung:
Code:
WITH anmeldungen AS (
SELECT id, Type, CONVERT(DATETIME, STUFF(STUFF(STUFF(Datum + Uhrzeit,13,0,':'),11,0,':'),9,0,' ')) AS FormattedDate, Benutzer
FROM ProtokollTest
WHERE Type = 1 --1=Angemeldet
), 
abmeldungen AS (
SELECT id, Type, CONVERT(DATETIME, STUFF(STUFF(STUFF(Datum + Uhrzeit,13,0,':'),11,0,':'),9,0,' ')) AS FormattedDate, Benutzer
FROM ProtokollTest
WHERE Type = 2 --2=Abgemeldet
)
SELECT *, DATEDIFF(second, an.FormattedDate, ab.FormattedDate) as Dauer
FROM anmeldungen AS an
LEFT JOIN abmeldungen as ab
ON an.Benutzer = ab.Benutzer

Hat einer ne Idee und könnte mir bitte helfen :)
Grüße
 

Anhänge

  • protokollTabelle_vorher.png
    protokollTabelle_vorher.png
    8 KB · Aufrufe: 1
  • protokollTabelle_nachher.png
    protokollTabelle_nachher.png
    7,5 KB · Aufrufe: 1
Werbung:
Ich habe für unsere Zeiterfassung genau das gebaut, natürlich sind dort Spaltennamen anders etc.
Code:
WITH t AS (
    SELECT    ROW_NUMBER() OVER (PARTITION BY Pers_Nr ORDER BY EventDate,EventTime) AS zeile,
            convert(DATETIME,EventDate) + convert(DATETIME,EventTime) AS EventTimestamp,
            Pers_Nr,
            EventDate,
            EventType,
            CreatedBy
    FROM    tabelle_zeiterfassungssystem
    )
    SELECT    datediff(minute,t1.EventTimestamp,(CASE WHEN t2.EventTimestamp IS NULL AND convert(DATE,t1.EventDate) = convert(DATE,getdate()) THEN getdate() ELSE t2.EventTimestamp END)) AS EventTime,
            t1.Pers_Nr,
            t1.EventDate,
            t1.CreatedBy
    FROM    t t1
    LEFT JOIN t t2
    ON        t1.Pers_Nr = t2.Pers_Nr
    AND        t1.zeile + 1 = t2.zeile
    AND        t2.EventType IN ( -2,3 ) --2tes mal kommen gestempelt wird vermutlich noch nicht richtig erkannt
    WHERE    t1.EventType = -1
Ich musste auch erst aus 2 Spalten Datum und Zeit einen vernünftigen Wert bilden. EventType -1 ist quasi dein Typ 1, -2 und 3 sind verschiedene Werte für Pause und Gehen. Der Join würde auch solche Datensätze zeigen wo kein "Gehen" gestempelt wurde, da ist aber auch noch Luft nach Oben in Sachen Fehlersuche.
 
Zurück
Oben