Reputation: 75
I have the below SQL query that returns the following output for employee time ATTENDANCE.
Note when InOut = '0'
it means in, and if InOut = '1'
it means out.
Query:
SELECT
DATEPART(mi, LogTime) AS [InMin],
OutletName as [InOutletName]
FROM
[dbo].[AccessLog]
INNER JOIN
dbo.Outlets ON dbo.Outlets.OutletCode = dbo.AccessLog.TerminalID
WHERE
DATEPART(HOUR, LogTime) = '15'
AND InOut = '0'
AND CAST(LogDate AS date) = '2016-12-01'
Output:
InMin InOutletName
--------------------
47 GJ-SH1
The output I am looking for in to get OutMin, OutOutletName
and this can be applied when InOut = '1'
Desired output:
InMin InOutletName OutMin OutOutletName
-----------------------------------------
47 GJ-SH1 10 GJ-SH1
Upvotes: 0
Views: 117
Reputation: 883
I didn't get a chance to try it out in my SSMS, but required query should be something like this -
SELECT
Case When InOut = '0' Then DATEPART(mi, LogTime) End AS [InMin],
Case When InOut = '0' Then OutletName End as [InOutletName],
Case When InOut = '1' Then DATEPART(mi, LogTime) End AS [OutMin],
Case When InOut = '1' Then OutletName End as [OutOutletName]
FROM
[dbo].[AccessLog]
INNER JOIN
dbo.Outlets ON dbo.Outlets.OutletCode = dbo.AccessLog.TerminalID
WHERE
DATEPART(HOUR, LogTime) = '15'
AND CAST(LogDate AS date) = '2016-12-01';
Upvotes: 1
Reputation: 2211
I just wrote it on the fly, not sure about the result but you can try it. It may help:
;with InQuery as (SELECT
DATEPART(mi, LogTime) AS [InMin],
OutletName as [InOutletName]
FROM [dbo].[AccessLog]
INNER JOIN dbo.Outlets
ON dbo.Outlets.OutletCode = dbo.AccessLog.TerminalID
WHERE DATEPART(HOUR, LogTime) = '15'
AND InOut = '0'
AND CAST(LogDate AS date) = '2016-12-01'),
OutQuery As (SELECT
DATEPART(mi, LogTime) AS [OutMin],
OutletName as [OutOutletName]
FROM [dbo].[AccessLog]
INNER JOIN dbo.Outlets
ON dbo.Outlets.OutletCode = dbo.AccessLog.TerminalID
WHERE DATEPART(HOUR, LogTime) = '15'
AND InOut = '1'
AND CAST(LogDate AS date) = '2016-12-01')
select iq.*, oq.* from InQuery iq, OutQuery oq
Upvotes: 0
Reputation: 82474
A simple solution would be to join the AccessLog
table twice:
SELECT
DATEPART(mi, ali.LogTime) AS [InMin],
DATEPART(mi, alo.LogTime) AS [OutMin],
OutletName as [InOutletName]
FROM dbo.Outlets
INNER JOIN [dbo].[AccessLog] ali
ON dbo.Outlets.OutletCode = ali.TerminalID
LEFT JOIN [dbo].[AccessLog] alo
ON dbo.Outlets.OutletCode = al0.TerminalID AND CAST(ali.LogDate AS date) = CAST(alo.LogDate AS date) AND alo.InOut = '1'
WHERE DATEPART(HOUR, LogTime) = '15'
AND ali.InOut = '0'
AND CAST(ali.LogDate AS date) = '2016-12-01'
Note that for the AccessLog
representing the out date I've used a left join
, so that you will also get Outlet names that hasn't logged out yet.
Upvotes: 0