2011-11-30 3 views
1
if object_id('tempdb..#timing') is not null drop table #timing 

create table #timing (
    logid int identity(1, 1), 
    empid int, 
    logtime datetime 
) 

insert into #timing 
select 11, '20111201 8:03' union all select 11, '20111201 8:09' union all 
select 12, '20111201 8:38' union all select 12, '20111201 9:31' union all 
select 12, '20111201 9:31' union all select 12, '20111201 9:36' union all 
select 11, '20111201 9:37' union all select 11, '20111201 9:44' union all 
select 11, '20111201 9:48' union all select 11, '20111201 9:50' 


;with cte as (
    select top 100 percent 
     empid, 
     cast(datepart(hh, logtime) as varchar(2)) + ':' + 
     right('0' + cast(datepart(mi, logtime) as varchar(2)), 2) as logtime, 
     row_number() over (partition by empid order by logid) as row 
    from #timing 
    order by logid asc 
) 
select c1.empid as EmployeeID, min(c1.logtime) as InTime, max(c2.logtime) as OutTime, min(isnull(p.punches, '')) as Punches 
from cte c1 
join cte c2 on c1.row + 1 = c2.row and c1.empid = c2.empid 
left join (
    select empid, 
     (select '(' + stuff(
      (select ', ' +c1.logtime + ' In, ' + c2.logtime + ' Out' 
      from cte c1 
      join cte c2 on c1.row + 1 = c2.row and c1.empid = c2.empid 
      where c1.row % 2 = 1 and c3.empid = c1.empid 
      for xml path(''), type).value('text()[1]','varchar(max)'), 1, 2, '') + ')' 
     ) as punches 
    from cte c3 
    group by empid 
) as p on p.empid = c1.empid 
group by c1.empid 
order by c1.empid 

В этом запросе я использовал поле типа Logtime varchar как строку и поле Date как DateTime, поэтому помогите мне внести изменения в этот запрос.Как хранить данные с SQL?

этот вопрос совершенен, но я использовал logtime как varchar type.so, я не получаю идеальный вывод в своем отчете.

Как это можно достичь?

+0

Что ваша таблица времени выглядеть? –

+0

Мои данные таблицы таковы: LogId EmployeeId LogTime Date –

+0

Как вы определяете, какая строка выводит «удары»? –

ответ

0

Edit: (после вопроса уточнения)

Я хотел бы сделать это таким образом, пример данных:

if object_id('tempdb..#timing') is not null drop table #timing 

create table #timing (
    logid int identity(1, 1), 
    empid int, 
    logtime datetime 
) 

insert into #timing 
select 11, '20111201 8:03' union all select 11, '20111201 8:09' union all 
select 12, '20111201 8:38' union all select 12, '20111201 9:31' union all 
select 12, '20111201 9:31' union all select 12, '20111201 9:36' union all 
select 11, '20111201 9:37' union all select 11, '20111201 9:44' union all 
select 11, '20111201 9:48' union all select 11, '20111201 9:50' 

и окончательный запрос:

;with cte as (
    select 
     empid, 
     cast(datepart(hh, logtime) as varchar(2)) + ':' + 
     right('0' + cast(datepart(mi, logtime) as varchar(2)), 2) as logtime, 
     row_number() over (partition by empid order by logid) as row 
    from #timing 
) 
select c1.empid as EmployeeID, c1.logtime as InTime, c2.logtime as OutTime, isnull(p.punches, '') as Punches 
from cte c1 
join cte c2 on c1.row + 1 = c2.row and c1.empid = c2.empid 
left join (
    select empid, 
     (select '(' + stuff(
      (select ', ' +c1.logtime + ' In, ' + c2.logtime + ' Out' 
      from cte c1 
      join cte c2 on c1.row + 1 = c2.row and c1.empid = c2.empid 
      where c1.row % 2 = 1 and c3.empid = c1.empid 
      for xml path(''), type).value('text()[1]','varchar(max)'), 1, 2, '') + ')' 
     ) as punches 
    from cte c3 
    group by empid 
) as p on c2.row = (select max(row) from cte where empid = c2.empid) and p.empid = c2.empid 
where c1.row % 2 = 1 
order by c1.empid, c1.row 

результат:

EmployeeID InTime OutTime Punches 
11   8:03 8:09  
11   9:37 9:44  
11   9:48 9:50 (8:03 In, 8:09 Out, 9:37 In, 9:44 Out, 9:48 In, 9:50 Out) 
12   8:38 9:31  
12   9:31 9:36 (8:38 In, 9:31 Out, 9:31 In, 9:36 Out) 

Добавлено:

Другой отчет:

;with cte as (
    select 
     empid, 
     cast(datepart(hh, logtime) as varchar(2)) + ':' + 
     right('0' + cast(datepart(mi, logtime) as varchar(2)), 2) as logtime, 
     row_number() over (partition by empid order by logid) as row 
    from #timing 
) 
select c1.empid as EmployeeID, min(c1.logtime) as InTime, max(c2.logtime) as OutTime, min(isnull(p.punches, '')) as Punches 
from cte c1 
join cte c2 on c1.row + 1 = c2.row and c1.empid = c2.empid 
left join (
    select empid, 
     (select '(' + stuff(
      (select ', ' +c1.logtime + ' In, ' + c2.logtime + ' Out' 
      from cte c1 
      join cte c2 on c1.row + 1 = c2.row and c1.empid = c2.empid 
      where c1.row % 2 = 1 and c3.empid = c1.empid 
      for xml path(''), type).value('text()[1]','varchar(max)'), 1, 2, '') + ')' 
     ) as punches 
    from cte c3 
    group by empid 
) as p on p.empid = c1.empid 
group by c1.empid 
order by c1.empid 

Пожалуйста, имейте в виду, что результат для шахтной данных выборки:

EmployeeID InTime OutTime Punches 
11   8:03 9:50 (8:03 In, 8:09 Out, 9:37 In, 9:44 Out, 9:48 In, 9:50 Out) 
12   8:38 9:36 (8:38 In, 9:31 Out, 9:31 In, 9:36 Out) 
+0

Как я могу добавить EmployeeID в этот запрос, я хочу добавить employeeId также. –

+0

@ user1070790 проверить мое редактирование. –

+0

PLZ проверить мое другое редактирование ... –

Смежные вопросы