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)