2016-07-18 2 views
1

я вроде застрял в запрашивая мой стол Timelogs, являются следующие выборочные данные:Pivoting Timelogs в Sql запросов

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 

Требуемая мощность:

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 

Где Type (1) = время в и Type (2) = тайм-аут.

Сотрудники должны выйти из системы на 12nn, а затем снова войти в систему через пару минут.

Я попытался использовать опорную точку, основанную на предыдущих вопросах, которые я читаю здесь. Хотя это первый раз, когда я пытался использовать опорную точку в таблицах.

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;       

Вывод запроса:

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 

это возможно? Благодарю. : D

Edit:

как предложено Верчелли, другой сценарий, как, например, пользователь забыл, что он/она уже приуроченная всего пару минут назад, так что она приурочена снова. , например.

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 

Я попытался с помощью запроса г-Верчелли:

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; 

Выход нового запроса:

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 

Ожидаемый результат:

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 

Благодарность за помогите парням: D. Я изучаю новые вещи из этой проблемы.

ответ

0

Я думаю, что это то, что вы ищете. 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

Спасибо за ответы. Запрашивает ли фильтр результаты или строку на основе значения 'type', которое он содержит? : D Я попытался создать пример здесь [link] (https://data.stackexchange.com/meta.stackexchange/query/514106/pivoting-timelogs-in-sql-query2). Например, пользователь дважды регистрировался с тех пор, как забыл, что недавно зашел в систему. – jkw

+0

@jkw Я понимаю, что вы имеете в виду, но как бы вы его показали? Пожалуйста, отредактируйте свой вопрос, чтобы показать этот новый сценарий – vercelli

+0

Я обновил вопрос сэром. Еще раз спасибо: D. – jkw

0

DEMO HERE

--- Таблица Creattion Сценарии

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) 

Запрос

;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

Я получаю таймаут> timein1, это должно быть в обратном порядке – vercelli

+0

@vercelli: Обновлено сейчас. – TheGameiswar

+0

@TheGameiswar: спасибо за ответ, я попробовал запрос, но он выводит [Err] 42000 - [SQL Server] 'lead 'не является признанным встроенным именем функции. Возможно, из-за проблем с несовместимостью. Я прочитал на сайте microsoft, что функция встроена с версии 2012 года и выше. – jkw