加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 选择将日期相同的列分组到不同的列中

发布时间:2020-12-12 07:01:25 所属栏目:MsSql教程 来源:网络整理
导读:我有一个登录表,如下所示: Created | Action20/01/2016 08:00:00 AM login20/01/2016 10:05:10 AM logout20/01/2016 12:00:00 PM login20/01/2016 04:12:22 PM logout21/01/2016 08:00:50 AM login21/01/2016 09:44:42 AM login21/01/2016 10:44:42 AM login
我有一个登录表,如下所示:
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],MAX(lo.Created),8) [Logout]
FROM Logins li
LEFT JOIN Logins lo ON lo.[Action] = 'logout'
GROUP BY li.Created

但结果没有按日期分组.

什么是正确的方法?

解决方法

与Rahul的答案类似,但您可以自行加入以获得首次登录/上次登出,并按日期分组以获得您要求的结果;
SELECT CONVERT(DATE,li.created)  [Date],CONVERT(TIME,MIN(li.created)) [Login],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)

An SQLfiddle to test with.

编辑:未经测试的SQL Server 2005,您可能需要设置varchars的长度;

SELECT CONVERT(VARCHAR,li.created,110)    [Date],CONVERT(VARCHAR,MAX(li.created),MAX(lo.created),8) [Logout] 
FROM Logins li 
JOIN Logins lo 
  ON CONVERT(VARCHAR,110) = CONVERT(VARCHAR,lo.created,110)
 AND li.action = 'login'
 AND lo.action = 'logout' 
GROUP BY CONVERT(VARCHAR,110)

Another SQLfiddle.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读