Sql 将两个表中的行转换为列

Sql 将两个表中的行转换为列,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我试图查询一个考勤数据库,该数据库显示两个表中的以下数据 USERINFO USERID Name 1 Joe Bloggs CHECKINOUT USERID CHECKTIME 1 27/05/2014 07:44 1 27/05/2014 13:50 1 28/05/2014 08:12 1 28/05/2014 16:27 1 29/05/2014 07:46 1 29/05/2014 16:30 1 30/05/2014 07:

我试图查询一个考勤数据库,该数据库显示两个表中的以下数据

USERINFO
USERID   Name
1    Joe Bloggs

CHECKINOUT
USERID   CHECKTIME
1    27/05/2014 07:44
1    27/05/2014 13:50
1    28/05/2014 08:12
1    28/05/2014 16:27
1    29/05/2014 07:46
1    29/05/2014 16:30
1    30/05/2014 07:40
1    30/05/2014 15:59


Select dbo.USERINFO.NAME, dbo.CHECKINOUT.CHECKTIME 
FROM dbo.USERINFO Inner Join dbo.CHECKINOUT on dbo.USERINFO.USERID = dbo.CHECKINOUT.USERID
Query results:
Name    CheckTime
Joe Bloggs  27/05/2014 07:44
Joe Bloggs  27/05/2014 13:50
Joe Bloggs  28/05/2014 08:12
Joe Bloggs  28/05/2014 16:27
Joe Bloggs  29/05/2014 07:46
Joe Bloggs  29/05/2014 16:30
Joe Bloggs  30/05/2014 07:40
Joe Bloggs  30/05/2014 15:59
我想看到的是这样的东西:

Name    CheckTime   ClockIn ClockOut
Joe Bloggs  27/05/2014  07:44:55    13:50:53
Joe Bloggs  28/05/2014  08:12:03    16:27:10
Joe Bloggs  29/05/2014  07:46:59    16:30:06
Joe Bloggs  30/05/2014  07:40:23    15:59:41
我尝试了所有关于将该站点中的行转换为列的建议,但都无法实现

编辑: 基本上,我尝试了PIVOT、XML方法、CASE语句和COALESCE函数,但我得到了大量的错误。我对SQL Server相当陌生,但在MSAccess中完成了PIVOT


任何帮助都将不胜感激

以下代码将为您提供类似的帮助,希望这是您想要的

名称|打卡|打卡 乔·布洛格斯| 2014-05-27 07:44:00.000 | 2014-05-27 13:50:00.000 乔·布洛格斯| 2014-05-28 08:12:00.000 | 2014-05-28 16:27:00.000 Joe Bloggs | 2014-05-29 07:46:00.000 | 2014-05-29 16:30:00.000 乔·布洛格斯| 2014-05-3007:40:00.000 | 2014-05-3015:59:00.000

希望这对你有帮助,祝你度过愉快的一天


Etienne

您不需要PIVOT或XML之类的东西,只需按日期分组即可

SELECT UserID
     , DateAdd(dd, DateDiff(dd, 0, CHECKTIME), 0) CheckTime
     , CONVERT(VARCHAR(8), Min(CHECKTIME),108) ClockIn 
     , CONVERT(VARCHAR(8), Max(CHECKTIME),108) ClockOut
FROM   CHECKINOUT
GROUP BY UserID, DateAdd(dd, DateDiff(dd, 0, CHECKTIME), 0)

你遵循了什么具体建议?你尝试了什么?你在哪里失败了?因为这似乎只是你需要做的一个普通的支点,而且网上有大量关于如何做的信息,非常有用。谢谢你Etienne,我来试试:
SELECT convert(datetime, Checkdate, 103)
SELECT UserID
     , DateAdd(dd, DateDiff(dd, 0, CHECKTIME), 0) CheckTime
     , CONVERT(VARCHAR(8), Min(CHECKTIME),108) ClockIn 
     , CONVERT(VARCHAR(8), Max(CHECKTIME),108) ClockOut
FROM   CHECKINOUT
GROUP BY UserID, DateAdd(dd, DateDiff(dd, 0, CHECKTIME), 0)