【问题标题】:Complex SQL sorting and grouping复杂的 SQL 排序和分组
【发布时间】:2012-09-14 16:22:42
【问题描述】:

我在每天的时间记录中对数据进行分组和排序时遇到问题 自动生成报告。 DTR的表结构如下:

记录日期 记录时间 员工姓名 记录类型 2012 年 9 月 13 日 17:00:00 SALITA,LYNYRD ANTONIO 注销 9/13/2012 8:05:00 SALITA, LYNYRD ANTONIO 登录 2012 年 9 月 12 日 17:05:00 SALITA,LYNYRD ANTONIO 注销 9/12/2012 8:05:00 SALITA, LYNYRD ANTONIO 登录 2012 年 7 月 10 日 17:00:00 加西亚,阿尔文登出 2012 年 7 月 10 日 17:00:00 奥雷诺,莉亚登出 2012 年 7 月 10 日 17:00:00 SALITA,LYNYRD ANTONIO 注销 2012 年 7 月 10 日 17:00:00 坎西诺,保罗登出 2012 年 7 月 10 日 17:00:00 BELO,RIO 注销 2012 年 7 月 10 日 17:00:00 MAG-ISA,美贝尔登出 2012 年 7 月 10 日 17:00:00 TARINE, KAREN 登出 2012 年 7 月 10 日 17:00:00 REYES,ANDREA 注销 2012 年 7 月 10 日 17:00:00 纳瓦罗,克里斯蒂娜登出 7/10/2012 10:30:00 MAG-ISA, MAYBELLE 登录 7/10/2012 8:00:00 SALITA, LYNYRD ANTONIO 登录 2012 年 7 月 10 日 8:00:00 卡西诺,保罗登录 2012 年 7 月 10 日 8:00:00 BELO,RIO 登录 2012 年 7 月 10 日 7:40:00 奥雷诺,莉亚登录 2012 年 7 月 10 日 7:30:00 加西亚,阿尔文登录 2012 年 7 月 10 日 7:25:00 TARINE, KAREN 登录 2012 年 7 月 10 日 7:10:00 纳瓦罗,克里斯蒂娜 登录 2012 年 7 月 10 日 7:10:00 REYES,ANDREA 登录

我希望将其作为查询处理,输出如下:

登录日期 员工姓名 登录 注销 2012 年 9 月 13 日萨利塔,林尼德安东尼奥 8:05:00 17:00:00 2012 年 9 月 12 日萨利塔,林尼德安东尼奥 8:05:00 17:05:00 2012 年 7 月 10 日加西亚,阿尔文 7:30:00 17:00:00 2012 年 7 月 10 日奥雷诺,莉亚 7:40:00 17:00:00 2012 年 7 月 10 日萨利塔,林尼德安东尼奥 8:00:00 17:00:00 2012 年 7 月 10 日卡西诺,保罗 8:00:00 17:00:00 2012 年 7 月 10 日 BELO,里约热内卢 8:00:00 17:00:00 2012 年 7 月 10 日 MAG-ISA,美宝莲 10:30:00 17:00:00 2012 年 7 月 10 日 塔林,凯伦 7:25:00 17:00:00 2012 年 7 月 10 日 雷耶斯,安德烈亚 7:10:00 17:00:00 7/10/2012 纳瓦罗,克里斯蒂娜 7:10:00 17:00:00

我如何做到这一点?

【问题讨论】:

  • Wich RDBMS:MS SQL Server、MySQL、Postgre、Oracle?还有,你试过什么?发布一个有效的查询,无论它是错误的,也许你只是接近解决方案的一步

标签: sql sorting grouping


【解决方案1】:

这就是你想要得到的:

SELECT DATE_FORMAT(LogDate, '%d/%c/%Y') AS LogDate, EmployeeName,
   (GROUP_Concat(CASE LogType WHEN 'LOGIN' THEN LogTime END)) AS LOGIN,
   (GROUP_Concat(CASE LogType WHEN 'LOGOUT' THEN LogTime END)) AS LOGOUT
FROM myTable
GROUP BY LogDate, EmployeeName
ORDER BY LogDate desc;

See this SQLFiddle

查询说明:

使用CASE 语句将行转换为列(对于LoginLogout

SELECT DATE_FORMAT(LogDate, '%d/%c/%Y') AS LogDate, EmployeeName,
   (CASE LogType WHEN 'LOGIN' THEN LogTime END) AS LOGIN,
   (CASE LogType WHEN 'LOGOUT' THEN LogTime END) AS LOGOUT
FROM myTable
GROUP BY LogDate, EmployeeName, LogTime
ORDER BY LogDate desc;

但这会让你喜欢in this SQLFiddle.

所以您需要使用GROUP_CONCAT (MySQL) 将LogTimeNULL 连接起来,并从GROUP BY 子句中删除LogTime

【讨论】:

  • thnx 这解决了问题。我只需要校准变量!再次感谢!
  • 有没有办法只显示第一次登录和最后一次登录?
  • @LynyrdSalita 听不懂你的句子show only the first login and the last login。你能显示你想要的输出吗?
  • 哦,抱歉打错了,这意味着是最后一次注销
【解决方案2】:
Select  Log Date,   Employee Name,       LOGIN       LOGOUT 
    case(Log Type)
    when 'LOGIN' then Log Time AS LOGIN
    Else 
    Log Time AS LOGOUT
    End
From
YOUR_TABLE
order by Log Date desc

【讨论】:

    猜你喜欢
    • 2012-09-07
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多