sql >> データベース >  >> RDS >> Sqlserver

各従業員のすべてのパンチインとパンチアウトを取得しますか?

    副選択またはCTEを使用して、従業員によって順序付けられたデータを取得し、それをメインデータテーブルとして使用できます。これに似たもの(必要に応じて適応):

    ;with ordered as (
    select 
        emp_reader_id as empId,
        CONVERT(DATE, dt) as Punch,
        Row_number()
         OVER (PARTITION BY emp_reader_id ORDER BY CONVERT(DATE, dt) ASC) as OrderedPunch
    from trnevents
    )
    SELECT 
        entered.empId, 
        entered.Punch as PunchIn,
        exited.Punch as PunchOut
    from
        ordered as entered
        left join ordered as exited on 
            entered.empId = exited.empId
            and entered.OrderedPunch + 1 = exited.OrderedPunch
    

    説明:「注文済み」CTEには、日付順に注文された従業員の出入りが表示されます。 ROW_NUMBER PARTITION BYが原因で、従業員ごとにリセットされます(emp_reader_idには従業員IDが含まれていると思います)。 。

    各従業員のカウンターを取得したら、各従業員の各パンチ(左結合の最初の条件)とその従業員の次のパンチ(左結合の2番目の条件)を結合します。そうすれば、入口の列と出口(次のパンチ)を表示できます。

    データに入力列と出力列を取得した後、一部のデータを除外したい場合があります(各従業員の奇数行は必要な行です)。WHERE entered.OrderedPunch %2 = 1を追加します。




    1. SQLServerのあるデータベースから別のデータベースにテーブルをコピーする

    2. 2番目のテーブルに対応するエントリがない場合でも、2つのdbテーブルからクエリ結果を取得する

    3. JPAで作成されていない一意の制約

    4. World Backup Day:データベースをいつどのようにバックアップする必要がありますか?