2016-07-18 3 views
1

Ich bin ein bisschen stecken meine timelogs Tabelle in der Abfrage die folgenden sind die Beispieldaten:Verschwenkung timelogs in SQL-Abfrage

TimelogId  EmployeeId  RecordDate  RecordTime  Type 
---------  ----------  ----------  ----------  ---- 
    1    4   2016-07-01  07:18:37   1 
    2    4   2016-07-01  12:03:14   2 
    5    4   2016-07-01  12:08:02   1 
    6    4   2016-07-01  18:02:03   2 
    7    6   2016-07-19  07:24:15   1 
    8    5   2016-07-19  07:26:03   1 
    9    6   2016-07-19  12:15:26   2 
    10    5   2016-07-19  12:35:17   2 
    13    5   2016-07-19  12:36:14   1 
    16    6   2016-07-19  12:45:45   1 
    17    6   2016-07-19  17:10:22   2 
    18    5   2016-07-19  18:43:09   2 

Die erforderliche Leistung:

Date  EmployeeId Time_In  Time_Out  Time_In  Time_Out 
    ------- ---------- --------  --------  -------  ------- 
2016-07-01  4   07:18:37  12:03:14  12:08:03 18:02:03 
2016-07-19  6   07:24:15  12:15:26  12:45:45 17:10:22 
2016-07-19  5   07:26:03  12:35:17  12:36:14 18:43:08 

Wo Type (1) = time in und Type (2) = Timeout.

Die Mitarbeiter müssen sich bei 12nn abmelden und sich nach einigen Minuten erneut anmelden.

Ich versuchte mit Pivot basierend auf den vorherigen Fragen, die ich hier gelesen habe. Obwohl dies das erste Mal ist, dass ich versucht habe, Pivot in Tabellen zu verwenden.

select 
* 
FROM 
(
    select 
    EmployeeID, 
    RecordDate, 
    RecordTime, 
    Type 
    from tblTimeLogs 
) d 
PIVOT(
    Max(RecordTime) <---- I think the problem is right around here 
    FOR Type in ([1],[2]) <----- plus i can't seem to rename this column names maybe i'll read a little further on this. 
) piv;       

Ausgabe der Abfrage:

EmployeeID   RecordDate   1    2 
----------   ----------  ------   ------ 
    4    2016-07-01  12:08:02  18:02:03 
    5    2016-07-19  12:36:14  18:43:09 
    6    2016-07-19  12:45:45  17:10:22 

ist das möglich? Vielen Dank. : D

Edit:

wie vercelli vorgeschlagen, zum Beispiel ein anderes Szenario, wie der Benutzer vergessen, dass er/sie vor in nur ein paar Minuten zeitlich bereits so getaktet sie wieder in. z.B.

TimelogId  EmployeeId  RecordDate  RecordTime  Type 
---------  ----------  ----------  ----------  ---- 
    1    4   2016-07-01  07:18:37   1 
    2    4   2016-07-01  12:03:14   2 
    5    4   2016-07-01  12:08:02   1 
    6    4   2016-07-01  18:02:03   2 
    7    6   2016-07-19  07:24:15   1 
    8    5   2016-07-19  07:26:03   1 
    9    6   2016-07-19  12:15:26   2 
    10    5   2016-07-19  12:35:17   2 
    13    5   2016-07-19  12:36:14   1 
    16    6   2016-07-19  12:45:45   1 
    17    6   2016-07-19  17:10:22   2 
    18    5   2016-07-19  18:43:09   2 
    19    5   2016-07-20  08:13:35   1 <--- Time in 
    20    5   2016-07-20  08:14:35   1 <--- Timed In again 
    21    5   2016-07-20  12:15:12   2 <--- Time Out 

Ich habe versucht, die Abfrage von Herrn Vercelli mit:

select 
EmployeeID as Emp, RecordDate, [1] as Time_In1, [2] as Time_Out1, [3] as Time_In2, [4] as Time_out2 
FROM 
(
    select 
    EmployeeID, 
    RecordDate, 
    RecordTime, 
    ROW_NUMBER() over (partition by EmployeeId, RecordDate order by RecordTime, type) as rn 
from tblTimeLogs 
) d 
PIVOT(
    max(RecordTime) 
    FOR rn in ([1],[2],[3],[4]) 
) as piv; 

Ausgabe der neuen Abfrage:

Emp RecordDate Time_In1 Time_Out1 Time_In2  Time_Out2 
---- ---------- --------- --------- --------  --------- 
    4 2016-07-01 07:18:37 12:03:14  12:08:02  18:02:03 
    5 2016-07-19 07:26:03 12:35:17  12:36:14  18:43:09 
    5 2016-07-20 08:13:35 08:14:35  12:15:12  Null <--- the problem is right around this portion 
    6 2016-07-19 07:24:15 12:15:26  12:45:45  17:10:22 

Erwartete Ausgabe:

Emp RecordDate Time_In1 Time_Out1 Time_In2 Time_Out2 
---- ---------- --------- --------- --------  --------- 
    4 2016-07-01 07:18:37 12:03:14  12:08:02  18:02:03 
    5 2016-07-19 07:26:03 12:35:17  12:36:14  18:43:09 
    5 2016-07-20 08:13:35 12:15:12  08:14:35  Null <--- the second time in would fall on the second 5th column (Time_In2) since the **Type** value is = 1  
    6 2016-07-19 07:24:15 12:15:26  12:45:45  17:10:22 

Vielen Dank für die Hilfe Jungs: D. Ich lerne neue Dinge aus diesem Problem.

Antwort

0

Ich denke, das ist, was Sie suchen. Demo:

select 
EmployeeID as Emp, RecordDate, [1] as Time_In1, [2] as Time_Out1, [3] as Time_In2, [4] as Time_out2 
FROM 
(
    select 
    EmployeeID, 
    RecordDate, 
    RecordTime, 
    ROW_NUMBER() over (partition by EmployeeId, RecordDate order by RecordTime, type) as rn 
    from tblTimeLogs 
) d 
PIVOT(
    max(RecordTime) 
    FOR rn in ([1],[2],[3],[4]) 
) as piv; 

OUPUT

Emp RecordDate Time_In1 Time_Out1 Time_In2 Time_out2 
4 2016-07-01 07:18:37 12:03:14 12:08:02 18:02:03 
5 2016-07-19 07:26:03 12:35:17 12:36:14 18:43:09 
6 2016-07-19 07:24:15 12:15:26 12:45:45 17:10:22 
+0

Vielen Dank für Ihre Antwort. Sortiert die Abfrage die Ergebnisse oder die Zeile basierend auf dem darin enthaltenen 'type'-Wert? : D Ich habe versucht, hier ein Beispiel zu erstellen [link] (https://data.stackexchange.com/meta.stackexchange/query/514106/pivoting-timelogs-in-sql-query2). Wie zum Beispiel hat sich der Benutzer zweimal angemeldet, seit er vergessen hat, dass sie sich gerade erst eingeloggt hat. – jkw

+0

@jkw Ich sehe, was du meinst, aber wie würdest du es zeigen? Bitte bearbeiten Sie Ihre Frage, um dieses neue Szenario zu zeigen – vercelli

+0

Ich habe die Frage Sir aktualisiert. Nochmals vielen Dank: D. – jkw

0

DEMO HERE

--- Tabelle Creattion Scripts

create table #test 
    (
    employeeid int, 
    recorddate date, 
    recordtime time, 
    typee int 
    ) 

insert into #test values( 4 ,   '2016-07-01',  '07:18:37',   1) 
insert into #test values( 4 ,   '2016-07-01',  '12:03:14',   2) 
insert into #test values( 4 ,   '2016-07-01',  '12:08:02',   1) 
insert into #test values( 4 ,   '2016-07-01',  '18:02:03',   2) 

Anfrage

;with cte 
as 
(
select 
employeeid, 
max(recorddate) as recorddate, 
min(recordtime) as timein, 
max(recordtime) as Timein1 , 
lead(min(recordtime)) over (partition by employeeid order by min(recordtime)) as 'timeout1', 
lead(max(recordtime)) over (partition by employeeid order by max(recordtime)) as 'timeout2' 
from #test 
group by 
employeeid,typee 
) 
    select employeeid,recorddate,timein,timeout1,timein1,timeout2 
    from cte 
    where timeout1 is not null and timeout2 is not null 
+0

Ich bekomme timeout> timein1, sollte es andersrum sein – vercelli

+0

@vercelli: Aktualisiert check jetzt – TheGameiswar

+0

@TheGameiswar: danke für die antwort, habe ich die Abfrage versucht, aber es gibt [Err] 42000 - [SQL Server] 'führen 'ist kein anerkannter integrierter Funktionsname. Wahrscheinlich aufgrund von Inkompatibilitätsproblemen. Ich habe in der Microsoft Website gelesen, dass die Funktion ab 2012 und höher integriert ist. – jkw