-2

これは、質問の継続/追加された複雑さです: sql query - Get the difference time between swipe in - Swipe out for employee . 同様のスワイプ イン/アウト データがありますが、追加の制約があります。

サンプル ソース データ:

EMPID EVENT_TYPE Swipe_time
1     EN1        2012-06-01 12:00
1     EX         2012-06-01 12:30
2     EN1        2012-06-01 12:50
1     EN2        2012-06-01 13:10
1     EN2        2012-06-01 15:50
2     EX         2012-06-01 13:30
2     EN1        2012-06-01 14:00
2     EX         2012-06-02 19:00
1     EX         2012-06-02 19:30

データは上記の形式で提供されますが、必要な出力および入力データによって複雑さが増します。

考慮すべき点は次のとおりです。

  1. 2 つのエントリ コードがあります: EN1、EN2 - 2 つの異なるオフィスを表しますが、両方のオフィスは同じコード EX で出口を記録します。両方のオフィスで費やされた時間は、従業員の勤務時間になります。

  2. 従業員がテールゲートできる場合があるため、エントリに対応する退出レコードが欠落している可能性があります (たとえば、上記のサンプル データの行 # 4 と 5 を検討してください)。出力の VALIDITY 列。

  3. 従業員は 1 日目にオフィス構内に入り、2 日目に退出できます (たとえば、上記のサンプル データの行 #8、9 を検討してください)。そのような場合、出力には 2 つのレコード/行が必要です: day1 の 1 行目:入場時間は event_type:'EN1 or EN2' の swipe_time 、退場時間: 23:59 day2 の 2 行目: 入場時間: 00:00 、退場時間は event_type:'EX' の swipe_time です

  4. すべてのレコードには 2 つのフィールド DAY_HOURS CALENDER_HOURS が必要です。従業員が day1 の 18:00 に入社し、day2 の 3:00 に退社する場合、 DAY_HOURS = 8 時間 (全勤務時間) および CALENDER_HOURS = 6 時間 (その特定の日の時間)

必要な出力: 以下の形式の表:

EMPID EVENT_TYPE TIME_IN TIME_OUT DAY_HOURS CALENDER_HOURS VALIDITY
4

1 に答える 1

0

友人の助けを借りて、ポイント#2で言及された問題を解決しました:以下の手順により、SQLスクリプトでのみ解決策が必要だったので、SQLの知識がほとんどないため、3つの手順でソリューションを設計しました。処理できると確信しています専門家によるより簡単な方法で:

ベーステーブルを EMP_DATA と考えて、一時テーブルを 1 つ使用しました: Temp_1 ベーステーブルには、最終ステップでレコードにフラグを立てるために「VALIDITY」フィールドを追加しました。

EMP_DATA:

EMPID EVENT_TYPE Swipe_time       VALIDITY
1     EN1        2012-06-01 12:00
1     EX         2012-06-01 12:30
2     EN1        2012-06-01 12:50
1     EN2        2012-06-01 13:10
1     EN2        2012-06-01 15:50
2     EX         2012-06-01 13:30
2     EN1        2012-06-01 14:00
2     EX         2012-06-02 19:00
1     EX         2012-06-02 19:30

ステップ1:

以下のクエリは、EMP_DATA の行に行番号を割り当て、それらを temp_1 テーブルにコピーします。

create table Temp_1 (EMP_ID int, Event_Type char(10), Swipe_Time datetime, rownum int, Lastevent char(10), Nextevent char(10)) 

Insert into  Temp_1             
SELECT  EMP_ID, EVENT_TYPE,
ROW_NUMBER() OVER ( PARTITION BY EMP_ID 
ORDER BY SWIPE_TIME ) AS RowNumber      
    FROM EMP_DATA

ステップ 1 出力:

 EMPID EVENT_TYPE Swipe_time         RowNumber  LastEvent  NextEvent
1     EN1        2012-06-01 12:00    1
1     EX         2012-06-01 12:30    2
2     EN1        2012-06-01 12:50    1
1     EN2        2012-06-01 13:10    3
1     EN2        2012-06-01 15:50    4
2     EX         2012-06-01 13:30    2
2     EN1        2012-06-01 14:00    3
2     EX         2012-06-02 19:00    4
1     EX         2012-06-02 19:30    5

ステップ2:

temp_1 テーブルの行の各イベントの最後のイベント (前のイベント) と次のイベントを識別します。

 Update  main set main.LastEvent =yy.LEvent,main.NextEvent=yy.NEvent
 from TEMP_1 main
 inner join
 ( SELECT   A.EMP_ID , A.EVENT_TYPE, A.SWIPE_TIME, A.ROWNUMBER                                                                                                                                                                                                                                                          
               COALESCE(LastVal.ZONE_NAME, 'N/A') AS LEvent ,                                                                                                                                                                                                                                                               
                   COALESCE(NextVal1.ZONE_NAME, 'N/A') AS NEvent                                                                                                                                                                                                                                                       
          FROM Temp_1  A                                                                                                                                                                                                                                                               
               LEFT JOIN Temp_1 LastVal                                                                                                                                                                                                                                                        
                  ON A.EMP_ID= LastVal.EMP_ID
                     AND A.ROWNUMBER - 1 = LastVal.ROWNUMBER                                                                                                                                                                                                                                                   
               LEFT JOIN Temp_1 NextVal1                                                                                                                                                                                                                                                    
                  ON A.EMP_ID= NextVal1.EMP_ID
                     AND A.ROWNUMBER + 1 = NextVal1.ROWNUMBER)yy                                       
on main.EMP_ID=yy.EMP_ID,
and main.event_type=yy.event_type
and main.swipe_time = yy.swipe_event

ステップ 2 出力:

EMPID EVENT_TYPE Swipe_time         RowNumber  LastEvent  NextEvent
1     EN1        2012-06-01 12:00    1           N/A        EX
1     EX         2012-06-01 12:30    2           EN1        EN2
2     EN1        2012-06-01 12:50    1           N/A        EX
1     EN2        2012-06-01 13:10    3           EX         EN2
1     EN2        2012-06-01 15:50    4           EN2        EX
2     EX         2012-06-01 13:30    2           EN1        EN1
2     EN1        2012-06-01 14:00    3           EX         EX
2     EX         2012-06-02 19:00    4           EN1        N/A
1     EX         2012-06-02 19:30    5           EN2        N/A

ステップ 3:

LastEvent と NextEvent に基づいて、テールゲートされたエントリを特定し、以下のクエリでメイン テーブル EMP_DATA を更新できます。

 Update emp set emp.VALIDITY='N'
from EMP_DATA
INNER JOIN
(select *
from TEMP_1
where (EVENT_TYPE = 'EX' and LastEvent = 'EX') 
or (EVENT_TYPE IN ('EN1','EN2') and NextEvent  IN ('EN1','EN2')))yy
ON emp.EMP_ID = yy.EMP_ID
and emp.EVENT_TYPE = yy.EMP_ID
and emp.Swipe_time = yy.Swipe_time

最終出力: *ステップ 3 出力: *

EMPID EVENT_TYPE Swipe_time       VALIDITY
1     EN1        2012-06-01 12:00
1     EX         2012-06-01 12:30
2     EN1        2012-06-01 12:50
1     EN2        2012-06-01 13:10    N
1     EN2        2012-06-01 15:50    
2     EX         2012-06-01 13:30
2     EN1        2012-06-01 14:00
2     EX         2012-06-02 19:00
1     EX         2012-06-02 19:30
于 2013-11-18T16:33:08.443 に答える