[英]SQL server 2005 group by with same column but different date and time?
[英]select group same column by date into different column
我有一個登錄表,如下所示:
Created | Action
20/01/2016 08:00:00 AM login
20/01/2016 10:05:10 AM logout
20/01/2016 12:00:00 PM login
20/01/2016 04:12:22 PM logout
21/01/2016 08:00:50 AM login
21/01/2016 09:44:42 AM login
21/01/2016 10:44:42 AM login
21/01/2016 04:00:42 PM logout
我需要選擇一個如下所示的結果集:
Created | Login | Logout
20/01/2016 08:00:00 AM 04:12:22 PM
21/01/2016 08:00:50 PM 04:00:42 PM
這是我嘗試過的:
SELECT
CONVERT(VARCHAR(10),li.Created,10) [Date],
CONVERT(VARCHAR(8),MAX(li.Created),8) [Login],
CONVERT(VARCHAR(8),MAX(lo.Created),8) [Logout]
FROM Logins li
LEFT JOIN Logins lo ON lo.[Action] = 'logout'
GROUP BY li.Created
但結果沒有按日期分組。
什么是正確的方法?
你可以嘗試這樣:
SELECT
CONVERT(VARCHAR(10),li.Created,10) [Date],
CONVERT(VARCHAR(8),MAX(li.Created),8) [Login],
CONVERT(VARCHAR(8),MAX(lo.Created),8) [Logout]
From Logins li
Left Join Logins lo on lo.[Action] = 'logout'
GROUP BY CAST(li.Created AS DATE)
也就是說,您需要按日期分組記錄,而不是按日期和時間分組。
我將假設你的結果中20日凌晨4點注銷是一個疏忽,否則我們需要知道確定它應被視為當天注銷時間的邏輯。
一個問題是,您嘗試僅顯示日期作為您的組,但您按日期和時間進行分組。
試試這個:
SELECT
CAST(LI.created AS DATE) AS created,
MIN(CAST(LI.created AS TIME)) AS login,
MAX(CAST(LO.created AS TIME)) AS logout
FROM
dbo.My_Table LI
LEFT OUTER JOIN dbo.My_Table LO ON
LO.action = 'logout' AND
CAST(LO.created AS DATE) = CAST(LI.created AS DATE)
WHERE
LI.action = 'login'
GROUP BY
CAST(LI.created AS DATE)
另一件需要考慮的事情是登錄期是否可以跨越日期邊界。 如果這是在科技行業,那么登錄1/20 10pm並注銷1/21 2am並不奇怪。 ;)
與Rahul的答案類似,但您可以自行加入以獲得首次登錄/上次登出,並按日期分組以獲得您要求的結果;
SELECT CONVERT(DATE, li.created) [Date],
CONVERT(TIME, MIN(li.created)) [Login],
CONVERT(TIME, MAX(lo.created)) [Logout]
FROM Logins li
JOIN Logins lo
ON CONVERT(DATE, li.created) = CONVERT(DATE, lo.created)
AND li.action = 'login'
AND lo.action = 'logout'
GROUP BY CONVERT(DATE, li.created)
編輯:未經測試的SQL Server 2005,您可能需要設置varchars的長度;
SELECT CONVERT(VARCHAR, li.created, 110) [Date],
CONVERT(VARCHAR, MAX(li.created), 8) [Login],
CONVERT(VARCHAR, MAX(lo.created), 8) [Logout]
FROM Logins li
JOIN Logins lo
ON CONVERT(VARCHAR, li.created, 110) = CONVERT(VARCHAR, lo.created, 110)
AND li.action = 'login'
AND lo.action = 'logout'
GROUP BY CONVERT(VARCHAR, li.created, 110)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.