問題のある SQL クエリとその結果は次のとおりです。
ただし、必要なのは、データを次のようにフォーマットすることです。
Emp No Sign In Sign out
022195 2013-01-29 09:18:00 2013-01-29 19:18:00
043770 2013-01-29 10:07:00 2013-01-29 17:07:00
問題のある SQL クエリとその結果は次のとおりです。
ただし、必要なのは、データを次のようにフォーマットすることです。
Emp No Sign In Sign out
022195 2013-01-29 09:18:00 2013-01-29 19:18:00
043770 2013-01-29 10:07:00 2013-01-29 17:07:00
そのためにサブクエリを実行する必要はありません。テーブルに対する基本的な集計関数を使用して実行し、名前でグループ化できます
select
t.name as EmpNo,
min(t.date) as SignIn,
max(t.date) as SignOut
from text_based_attendance as t
group by t.name
order by t.name
このクエリにはエイリアス ( ) は必要ありませんがas t
、後で結合を簡単に変更および追加できるように、クエリにエイリアスを追加することをお勧めします。
PostgreSQL の場合、日付ごとにグループ化し、各日付の最小値と最大値を取得するには、次のようにします。
select
t.name as EmpNo,
t::date as Date,
min(t.date) as SignIn,
max(t.date) as SignOut
from text_based_attendance as t
group by t.name, t::date
order by t.name
date() 関数を使用して、MySQL で日を集計できます。コツは、group by 句で使用することです。
select name,
min(date) as Sign_In,
max(date) as Sign_Out,
from text_based_attendance
group by date(date), name
order by name
これにより、従業員を名前と勤務日でグループ化した結果が得られ、サインイン/アウト時間のみが表示されます。
ここに私の SQLFiddle があります: http://sqlfiddle.com/#!2/740e2/1
Orace では、EXTRACT 関数を使用して同じことを行います。
select name,
min(mdate) as Sign_In,
max(mdate) as Sign_Out
from text_based_attendance
group by EXTRACT(day from mdate),name
http://sqlfiddle.com/#!4/96b6c/1
Postgres の場合、Oracle とほぼ同じです。
http://www.postgresql.org/docs/7.4/static/functions-datetime.html
私がそれを正しく持っている場合:
select name,
min(date) as Sign_In,
max(date) as Sign_Out
from text_based_attendance
group by name