Sql查询:无法从其他表中添加列
我当前正在使用正确运行的此查询:Sql查询:无法从其他表中添加列,sql,stored-procedures,Sql,Stored Procedures,我当前正在使用正确运行的此查询: SELECT t.TestId, t.Days, t.UserId_Fk , [Date] = Convert(date,DATEADD(dd, 0, DATEDIFF(dd, 0, t.CheckIn))) , CheckIn = CONVERT(CHAR(5), t.CheckIn, 108) , CheckOut = CONVERT(CHAR(5), t.CheckOut, 108) , [Hours] = CAST(DATEDIFF(M
SELECT
t.TestId,
t.Days,
t.UserId_Fk
, [Date] = Convert(date,DATEADD(dd, 0, DATEDIFF(dd, 0, t.CheckIn)))
, CheckIn = CONVERT(CHAR(5), t.CheckIn, 108)
, CheckOut = CONVERT(CHAR(5), t.CheckOut, 108)
, [Hours] = CAST(DATEDIFF(MINUTE, t.CheckIn, t.CheckOut) / 60. AS DECIMAL(10,2))
FROM (
SELECT
TestId=t.TestId,
Days=t.Days,
t.UserId_Fk
, CheckIn = t.CheckInTime
, CheckOut = r.CheckInTime
, RowNum = ROW_NUMBER() OVER (PARTITION BY t.UserId_Fk, r.CheckInTime ORDER BY 1/0)
FROM UserTime t
OUTER APPLY (
SELECT TOP 1 *
FROM UserTime t2
WHERE
t2.CheckInTime > t.CheckInTime
AND DATEADD(dd, 0, DATEDIFF(dd, 0, t.CheckInTime)) = DATEADD(dd, 0, DATEDIFF(dd, 0, t2.CheckInTime))
AND t2.LoginStatus = 'O'
ORDER BY t2.CheckInTime
) r
WHERE t.LoginStatus = 'I'
) t
WHERE t.RowNum = 1
结果是:
TestId Days UserId_Fk Date CheckIn CheckOut Hours
45 Tuesday 3 2014-05-13 11:49 11:49 0.00
我想在此结果中添加另一个名为FullName的字段(列),该字段来自另一个字段
表用户
我尝试了各种方法,但都没有成功
表关系为:
Table Test
TestId int(pk)
UserId_Fk int
Days nvarchar(50)
CheckInTime datetime
LoginStatus char(1)
Table Users
UserId int(Pk)
FullName varchar(50)
首先加入Test&Users表,然后尝试选择用户的全名。您可以通过userid\u fk加入。加入后,您可以在加入的表上应用top 1选择和其他格式 如下所示:
SELECT
t.TestId,
t.Days,
t.UserId_Fk
, [Date] = Convert(date,DATEADD(dd, 0, DATEDIFF(dd, 0, t.CheckIn)))
, CheckIn = CONVERT(CHAR(5), t.CheckIn, 108)
, CheckOut = CONVERT(CHAR(5), t.CheckOut, 108)
, [Hours] = CAST(DATEDIFF(MINUTE, t.CheckIn, t.CheckOut) / 60. AS DECIMAL(10,2))
FROM
(SELECT *
FROM test
JOIN users
ON test.userid_fk=users.userid) t
OUTER APPLY (
SELECT TOP 1 *
FROM UserTime t2
WHERE
t2.CheckInTime > t.CheckInTime
AND DATEADD(dd, 0, DATEDIFF(dd, 0, t.CheckInTime)) = DATEADD(dd, 0, DATEDIFF(dd, 0, t2.CheckInTime))
AND t2.LoginStatus = 'O'
ORDER BY t2.CheckInTime
) r
WHERE t.LoginStatus = 'I'
) t
WHERE t.RowNum = 1
请尝试几次,如果有任何输入错误,请修复查询。您应该能够将t加入到用户中。当你尝试这样做时,你得到了什么结果?(确认钥匙确实匹配!)
SELECT
t.TestId,
t.Days,
t.FullName
, [Date] = Convert(date,DATEADD(dd, 0, DATEDIFF(dd, 0, t.CheckIn)))
, CheckIn = CONVERT(CHAR(5), t.CheckIn, 108)
, CheckOut = CONVERT(CHAR(5), t.CheckOut, 108)
, [Hours] = CAST(DATEDIFF(MINUTE, t.CheckIn, t.CheckOut) / 60. AS DECIMAL(10,2))
FROM (
SELECT
FullName=Users.FullName,
TestId=t.TestId,
Days=t.Days,
t.UserId_Fk
, CheckIn = t.CheckInTime
, CheckOut = r.CheckInTime
, RowNum = ROW_NUMBER() OVER (PARTITION BY t.UserId_Fk, r.CheckInTime ORDER BY 1/0)
FROM UserTime t
Inner join Users
on t.UserId_Fk=Users.UserId
OUTER APPLY (
SELECT TOP 1 *
FROM UserTime t2
WHERE
t2.CheckInTime > t.CheckInTime
AND DATEADD(dd, 0, DATEDIFF(dd, 0, t.CheckInTime)) = DATEADD(dd, 0, DATEDIFF(dd, 0, t2.CheckInTime))
AND t2.LoginStatus = 'O'
ORDER BY t2.CheckInTime
) r
WHERE t.LoginStatus = 'I'
) t
WHERE t.RowNum = 1