0

私は2つのテーブルEmployeeとAttendanceを持っています.今、欠勤と現在の従業員の両方の日付に関する記録が必要です.

お気に入り: -

表 1: 従業員 (EmpId、名前)

表 2: 出席 (Empid、CheckInOutDateTime、ステータス (-I/O など))

(従業員が出席テーブルに不在で記録が必要な場合、記録は利用できません)

今私は出力が欲しい:

**EmpID    Name  Date          Status**

1         Emp1   06/11/2013     Persant

2         Emp2   06/11/2013     Absant

3         Emp3   06/11/2013     Persant

1         Emp1   06/12/2013     Persant

2         Emp2   06/12/2013     absant

3         Emp3   06/12/2013     absant
4

5 に答える 5

0

これを試すことができます:

SELECT A.EmpId,A.Name,B.CheckInOutDateTime,status = CASE WHEN B.STATUS = 'IN' THEN 'PRESENT'
ELSE 'ABSENT' END from Table1 A join Table2 B ON A.Empid=B.empid

于 2013-06-11T05:36:16.693 に答える
0

探している SQL 機能は、外部結合と呼ばれます。他の SQL 機能についてもお読みください。

何らかの理由で外部結合を使用できない場合は、副選択を使用して出席テーブルのレコードをカウントできます。これは、特定の日に存在するかどうかに関係なく、ブール値のみに関心があるためです (カウント > 0、従業員は存在、カウント = 0、従業員が不在)。

于 2013-06-11T05:36:21.170 に答える
0

必要な結果を取得するための高度なクエリを作成することもできますが、考えられるすべての日付を含む 3 番目のテーブルも必要になります。

毎日の終わりに不在記録を追加するスケジュールされたタスクを作成する方が簡単だと思います。または、事前に全員を欠席させてから、従業員が現れたら出席するようにレコードを変更することもできます。

于 2013-06-11T05:37:33.103 に答える
0

擬似コードは次のとおりです。

for each date as varDate
   query = "SELECT COUNT(*) AS cnt FROM Employee te LEFT JOIN Attendance ta ON te.Empid = ta.Empid WHERE ta.CheckInOutDateTime = " + varDate.ToString() + " GROUP BY te.Empid";

上記のクエリの結果を表示しながら、次の操作を実行できます。

if Convert.ToInt32(dataRow("cnt")) > 0
   status = "Present";
else
   status = "Absent";
于 2013-06-11T07:10:47.343 に答える