2016-12-14 45 views
1

我有数据如下MS SQL 2012(要转数据)

enter image description here

,并希望输出

Name  Check In Date Check Out Date Check In Time Check Out Time 
Employee 1 20/11/2016  21/11/2016  03:52:15 PM  12:08:50 AM 
Employee 1 21/11/2016  22/11/2016  03:45:37 PM  12:14:25 AM 
Employee 1 22/11/2016  23/11/2016  03:41:34 PM  12:04:53 AM 

我试着当条件使用情况,但没有得到正确输出。 请帮助

问候 迈克尔

+1

每天只有一次入住/退房? –

回答

-1

您问题的标题说:“MS SQL 2012”,但您使用了“SQL服务器2008”的标签。这个解决方案将在两个工作。如果您完全按照您的要求显示,您仍然需要格式化日期和时间。

IF OBJECT_ID('tempdb..#Test', 'U') IS NOT NULL DROP TABLE #Test 

SELECT 'Employee 1' AS Name, 
'Check In' AS Type, 
CONVERT(DATETIME, '11/20/2016 3:52:15 PM') AS DateTime 
INTO #Test 
UNION 
SELECT 'Employee 1' AS Name, 
'Check Out' AS Type, 
CONVERT(DATETIME, '11/21/2016 12:08:50 AM') AS DateTime 
UNION 
SELECT 'Employee 1' AS Name, 
'Check In' AS Type, 
CONVERT(DATETIME, '11/21/2016 03:45:37 PM') AS DateTime 
UNION 
SELECT 'Employee 1' AS Name, 
'Check Out' AS Type, 
CONVERT(DATETIME, '11/22/2016 12:14:25 AM') AS DateTime 
UNION 
SELECT 'Employee 1' AS Name, 
'Check In' AS Type, 
CONVERT(DATETIME, '11/22/2016 03:41:34 PM') AS DateTime 
UNION 
SELECT 'Employee 1' AS Name, 
'Check Out' AS Type, 
CONVERT(DATETIME, '11/23/2016 12:04:53 AM') AS DateTime 
UNION 
SELECT 'Employee 1' AS Name, 
'Check In' AS Type, 
CONVERT(DATETIME, '11/23/2016 03:41:34 PM') AS DateTime 

; 
WITH CTE AS (
SELECT rownum = ROW_NUMBER() OVER (ORDER BY DateTime), 
Name, Type, DateTime 
FROM #Test 
) 
SELECT cte.Name, 
CONVERT(DATE, cte.DateTime) AS CheckInDate, 
CONVERT(DATE, nxt.DateTime) AS CheckOutDate, 
CONVERT(TIME, cte.DateTime) AS CheckInTime, 
CONVERT(TIME, nxt.DateTime) AS CheckOutTime 
FROM CTE 
LEFT JOIN CTE nxt ON nxt.rownum = CTE.rownum + 1 
WHERE cte.Type = 'Check In' 

如果您使用的是SQL Server 2012中您可以使用LAGLEAD功能。这种方法的基础和解释可以在here找到。

+0

我很好奇投票的理由。我的答案产生了要求将基本格式设置留给OP的内容。 – nscheaffer

+0

谢谢....两种方式工作 – Michael

+0

问候....我现在需要帮助。 – Michael

1

这将通过使用窗口功能得到你想要的。

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

create table #tt (name varchar(45), [status] varchar(16), [Date] varchar(16), [Time] varchar(16)) 

insert into #tt (name, [status], [date], [time]) values 

('Employee 1','Check In','20/11/2016','03:52:15 PM'), 
('Employee 1','Check Out','21/11/2016','12:08:50 AM'), 
('Employee 1','Check In','21/11/2016','03:45:37 PM'), 
('Employee 1','Check Out','22/11/2016','12:14:25 PM'), 
('Employee 1','Check In','22/11/2016','03:41:34 PM'), 
('Employee 1','Check Out','23/11/2016','12:04:53 PM') 


;with cte as(
    select 
     *, 
     ROW_NUMBER() over (partition by [Name] order by convert(datetime,[Date] + ' ' + convert(varchar(8),cast([time] as time)),103)) as rownum 
     from #tt) 


select 
    ci.Name, 
    ci.[Date] as CheckInDate, 
    ci.[Time] as CheckInTime, 
    co.[Date] as CheckOutDate, 
    co.[Time] as CheckOutTime 
from 
    cte ci 
    inner join cte co on 
    co.rownum = ci.rownum + 1 
where ci.status = 'Check In' 


--Results 
Name  CheckInDate CheckInTime CheckOutDate CheckOutTime 
Employee 1 20/11/2016 03:52:15 PM 21/11/2016 12:08:50 AM 
Employee 1 21/11/2016 03:45:37 PM 22/11/2016 12:14:25 PM 
Employee 1 22/11/2016 03:41:34 PM 23/11/2016 12:04:53 PM