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,以帮助我更改此查询。
这个查询很完美,但我已经将logtime用作varchar类型。所以我的报告中没有得到完美的输出。
怎么能实现呢?
答案 0 :(得分:0)
修改(问题澄清后)
我会这样做,示例数据:
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)