Question

I am using this query currently which is running correctly:

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

The result is :

 TestId      Days    UserId_Fk    Date        CheckIn  CheckOut Hours
  45       Tuesday      3        2014-05-13    11:49    11:49    0.00

I want to add another field(column) in this result Named FullName which is from another table Users I tried various things but was unsuccessful.

Table relations are:

              Table Test 

          TestId    int(pk) 
        UserId_Fk   int 
             Days   nvarchar(50)    
      CheckInTime   datetime    
      LoginStatus   char(1) 


              Table Users

        UserId  int(Pk) 
       FullName  varchar(50)    
Was it helpful?

Solution

First join Test & Users table and then try to select the full name of the user. You can join through userid_fk. After joining you can apply top 1 selection & other formating over that joined table.

Something like below:



    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

Please try few times and fix the query if there is any typo.

OTHER TIPS

 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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top