3

レポートを自動的に作成するために、毎日の時間レコードのデータをグループ化および並べ替えるのに問題があります。DTRのテーブル構造は次のとおりです。

LogDate LogTime EmployeeName LogType
2012-09-14 10:48:04 SALITA、LYNYRDANTONIOログアウト
2012-09-14 09:39:29 SALITA、LYNYRDANTONIOログアウト
2012-09-14 09:39:19 SALITA、LYNYRD ANTONIO LOGIN
2012-09-14 09:35:25 SALITA、LYNYRDANTONIOログアウト
2012-09-14 09:35:13 SALITA、LYNYRD ANTONIO LOGIN
2012-09-14 08:10:00 SALITA、LYNYRD ANTONIO LOGIN
2012-09-13 17:00:00 SALITA、LYNYRDANTONIOログアウト
2012-09-13 08:05:00 SALITA、LYNYRD ANTONIO LOGIN
2012-09-12 17:05:00 SALITA、LYNYRDANTONIOログアウト
2012-09-12 08:05:00 SALITA、LYNYRD ANTONIO LOGIN
2012-07-10 17:00:00 MAG-ISA、MAYBELLE LOGOUT
2012-07-10 17:00:00 BELO、RIO LOGOUT
2012-07-10 17:00:00 CANSINO、PAUL LOGOUT
2012-07-10 17:00:00 SALITA、LYNYRDANTONIOログアウト
2012-07-10 17:00:00 AURENO、LEAH LOGOUT
2012-07-10 17:00:00 GARCIA、ALVIN LOGOUT
2012-07-10 17:00:00 TARINE、KAREN LOGOUT
2012-07-10 17:00:00 REYES、ANDREA LOGOUT
2012-07-10 17:00:00 NAVARRO、KRISTINA LOGOUT
2012-07-10 10:30:00 MAG-ISA、MAYBELLE LOGIN
2012-07-10 08:00:00 SALITA、LYNYRD ANTONIO LOGIN
2012-07-10 08:00:00 CANSINO、PAUL LOGIN
2012-07-10 08:00:00 BELO、RIO LOGIN
2012-07-10 07:40:00 AURENO、LEAH LOGIN
2012-07-10 07:30:00 GARCIA、ALVIN LOGIN
2012-07-10 07:25:00 TARINE、KAREN LOGIN
2012-07-10 07:10:00 NAVARRO、KRISTINA LOGIN
2012-07-10 07:10:00 REYES、ANDREA LOGIN

このSQLで:

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;

私はこの結果を生み出すことができます

LogDateEmployeeNameログインログアウト
2012-09-14 SALITA、LYNYRD ANTONIO 08:10:00,09:35:13,09:39:19 09:35:25,09:39:29,10:48:04
2012-09-13 SALITA、LYNYRD ANTONIO 08:05:00 17:00:00
2012-09-12 SALITA、LYNYRD ANTONIO 08:05:00 17:05:00
2012-07-10 REYES、ANDREA 07:10:00 17:00:00
2012-07-10ナバロ、クリスティーナ07:10:00 17:00:00
2012-07-10タリーヌ、カレン07:25:00 17:00:00
2012-07-10 GARCIA、ALVIN 07:30:00 17:00:00
2012-07-10 AURENO、LEAH 07:40:00 17:00:00
2012-07-10 CANSINO、PAUL 08:00:00 17:00:00
2012-07-10 SALITA、LYNYRD ANTONIO 08:00:00 17:00:00
2012-07-10 BELO、RIO 08:00:00 17:00:00
2012-07-10 MAG-ISA、MAYBELLE 10:30:00 17:00:00

答えの1つに基づいて、これはコードです。

SELECT DATE_FORMAT(t1.LogDate, '%d/%c/%Y') AS LogDate, t1.EmployeeName
     , t1.LogTime AS Login
     , ( SELECT MIN(t2.LogTime) FROM myTable t2
          WHERE t2.LogType = 'LOGOUT'
            AND t2.LogDate = t1.LogDate
            AND t2.EmployeeName = t1.EmployeeName
            AND t2.LogTime > t1.LogTime ) AS Logout
  FROM myTable t1
 WHERE t1.LogType = 'LOGIN'

そしてそれはこの結果を生み出しました:

LogDateEmployeeNameログインログアウト
2012-09-14 SALITA、LYNYRD ANTONIO 08:10:00 09:35:25
2012-09-14 SALITA、LYNYRD ANTONIO 09:35:13 09:35:25
2012-09-14 SALITA、LYNYRD ANTONIO 09:39:19 09:39:29
2012-09-13 SALITA、LYNYRD ANTONIO 08:05:00 17:00:00
2012-09-12 SALITA、LYNYRD ANTONIO 08:05:00 17:05:00
2012-07-10 REYES、ANDREA 07:10:00 17:00:00
2012-07-10ナバロ、クリスティーナ07:10:00 17:00:00
2012-07-10タリーヌ、カレン07:25:00 17:00:00
2012-07-10 GARCIA、ALVIN 07:30:00 17:00:00
2012-07-10 AURENO、LEAH 07:40:00 17:00:00
2012-07-10 CANSINO、PAUL 08:00:00 17:00:00
2012-07-10 SALITA、LYNYRD ANTONIO 08:00:00 17:00:00
2012-07-10 BELO、RIO 08:00:00 17:00:00
2012-07-10 MAG-ISA、MAYBELLE 10:30:00 17:00:00

結果をこのように並べ替える方法はありますか?

LogDateEmployeeNameログインログアウト
2012-09-14 SALITA、LYNYRD ANTONIO 08:10:00 NULL
2012-09-14 SALITA、LYNYRD ANTONIO 09:35:13 09:35:25
2012-09-14 SALITA、LYNYRD ANTONIO 09:39:19 09:39:29
2012-09-14 SALITA、LYNYRD ANTONIO NULL 10:48:04
2012-09-13 SALITA、LYNYRD ANTONIO 08:05:00 17:00:00
2012-09-12 SALITA、LYNYRD ANTONIO 08:05:00 17:05:00
2012-07-10 REYES、ANDREA 07:10:00 17:00:00
2012-07-10ナバロ、クリスティーナ07:10:00 17:00:00
2012-07-10タリーヌ、カレン07:25:00 17:00:00
2012-07-10 GARCIA、ALVIN 07:30:00 17:00:00
2012-07-10 AURENO、LEAH 07:40:00 17:00:00
2012-07-10 CANSINO、PAUL 08:00:00 17:00:00
2012-07-10 SALITA、LYNYRD ANTONIO 08:00:00 17:00:00
2012-07-10 BELO、RIO 08:00:00 17:00:00
2012-07-10 MAG-ISA、MAYBELLE 10:30:00 17:00:00
4

1 に答える 1

4

このようなもの:

SELECT DATE_FORMAT(t1.LogDate, '%d/%c/%Y') AS LogDate, t1.EmployeeName
     , t1.LogTime AS Login
     , ( SELECT MIN(t2.LogTime) FROM myTable t2
          WHERE t2.LogType = 'LOGOUT'
            AND t2.LogDate = t1.LogDate
            AND t2.EmployeeName = t1.EmployeeName
            AND t2.LogTime > t1.LogTime ) AS Logout
  FROM myTable t1
 WHERE t1.LogType = 'LOGIN'

実際には何もグループ化していないため、GROUPBYは実際には必要ありません。

于 2012-09-14T02:32:14.973 に答える