0

2 つのまったく異なるソースからのデータを結合しようとしています。1 つのソースには従業員のスケジュール情報が含まれ、もう 1 つのソースには従業員が実際に働いたこと (実際に昼食や休憩をとった時間など) が追跡されます。問題は、スケジュール プログラムが時間を BREAK1、BREAK2、BREAK3、および LUNCH として提供するのに対し、追跡プログラムはそれらを単に昼食と休憩としてリストすることです。私はデータに参加して昼食をとることができますが、休憩は私をうんざりさせています. BREAK1、BREAK2、および BREAK3 を単に「Break」に変換すると、すべてのインスタンスが他のすべてのインスタンスと一致するため、セグメントが多すぎます。この 2 つの情報を結合する方法は誰でも思いつきますか? ありがとうございました。

編集 あなたの要求に応じて、ここにいくつかのサンプルデータがあります:

これはスケジュールされた時間です:

EMP_ID  NOM_DATE    SEG_CODE    START_MOMENT    STOP_MOMENT
626009  26-Sep-13   BREAK2          9/26/13 5:00 PM 9/26/13 5:15 PM
625650  26-Sep-13   BREAK2          9/26/13 4:30 PM 9/26/13 4:45 PM
638815  26-Sep-13   BREAK2          9/26/13 4:00 PM 9/26/13 4:15 PM
621649  26-Sep-13   BREAK2          9/26/13 3:30 PM 9/26/13 3:45 PM
567005  26-Sep-13   BREAK2          9/26/13 3:30 PM 9/26/13 3:45 PM
626009  26-Sep-13   LUNCH           9/26/13 2:30 PM 9/26/13 3:30 PM
625650  26-Sep-13   LUNCH           9/26/13 1:30 PM 9/26/13 2:30 PM
638815  26-Sep-13   LUNCH           9/26/13 1:30 PM 9/26/13 2:30 PM
621649  26-Sep-13   LUNCH          9/26/13 12:30 PM 9/26/13 1:30 PM
567005  26-Sep-13   LUNCH          9/26/13 12:30 PM 9/26/13 1:30 PM
626009  26-Sep-13   BREAK1         9/26/13 11:45 AM 9/26/13 12:00 PM
625650  26-Sep-13   BREAK1         9/26/13 11:30 AM 9/26/13 11:45 AM
638815  26-Sep-13   BREAK1         9/26/13 11:45 AM 9/26/13 12:00 PM
621649  26-Sep-13   BREAK1          9/26/13 9:30 AM 9/26/13 9:45 AM
567005  26-Sep-13   BREAK1  9/26/13 9:30 AM 9/26/13 9:45 AM

これは実際の時間です

EMP_ID  Seg_Code    Start_Time  Stop_Time
625650  Break           9/26/2013 17:54 9/26/2013 17:55
567005  Break           9/26/2013 14:56 9/26/2013 14:59
567005  Break           9/26/2013 15:32 9/26/2013 15:44
638815  Break           9/26/2013 16:34 9/26/2013 16:47
567005  Break           9/26/2013 10:08 9/26/2013 10:21
626009  Break           9/26/2013 17:01 9/26/2013 17:15
625650  Break           9/26/2013 11:31 9/26/2013 11:45
626009  Break           9/26/2013 11:52 9/26/2013 12:07
621649  Break           9/26/2013 9:34  9/26/2013 9:48
621649  Break           9/26/2013 15:31 9/26/2013 15:45
638815  Break           9/26/2013 11:46 9/26/2013 12:02
625650  Break           9/26/2013 16:35 9/26/2013 16:51
567005  Lunch           9/26/2013 12:31 9/26/2013 13:29
625650  Lunch           9/26/2013 13:31 9/26/2013 14:30
626009  Lunch           9/26/2013 14:31 9/26/2013 15:30
638815  Lunch           9/26/2013 13:31 9/26/2013 14:30
621649  Lunch           9/26/2013 12:31 9/26/2013 13:30

予定されている時間と実際に休憩を取っている時間の差 (分単位) を取得しようとしています。正しい例は次のとおりです。

Badge   Seg_Code    Scheduled Start     Scheduled Stop      Actual Start           Actual Stop      Difference      Seg_Duration
192329  Lunch       9/26/13 8:15 AM     9/26/13 9:15 AM     9/26/2013 8:18:27 AM    9/26/2013 9:17:59 AM        3       0:00:59:32

ありがとうございました

4

2 に答える 2

0

SQL Server の場合:

;WITH Actual_Ranked AS
(
    SELECT
        ROWNUM = CASE Seg_Code
                WHEN 'Break' THEN CAST(ROW_NUMBER() OVER (PARTITION BY EMP_ID, Seg_Code, CAST(Start_Time AS DATE) ORDER BY Start_Time) AS VARCHAR(1))
                ELSE ''
            END,
        EMP_ID,
        Seg_Code,
        Start_Time,
        Stop_Time
    FROM
        #Actual
)
SELECT
    ISNULL(sched.EMP_ID, act.EMP_ID) AS Badge,
    ISNULL(sched.SEG_CODE, (act.SEG_CODE + ROWNUM)) AS Seg_Code,
    CONVERT(VARCHAR, sched.START_MOMENT, 22) AS [Scheduled Start],
    CONVERT(VARCHAR, sched.STOP_MOMENT, 22) AS [Scheduled Stop],
    CONVERT(VARCHAR, act.Start_Time, 22) AS [Actual Start],
    CONVERT(VARCHAR, act.Stop_Time, 22) AS [Actual Stop],
    DATEDIFF(minute, sched.START_MOMENT, act.Start_Time) AS [Difference]
FROM
    #Scheduled sched
    FULL JOIN Actual_Ranked act ON sched.EMP_ID = act.EMP_ID
         AND sched.SEG_CODE = (act.SEG_CODE + ROWNUM);

必要に応じてテーブル名を置き換えます。

重要なのは、ブレークの行番号を取得し、それを追加して結合を機能させることです。

答えを簡単にするために含めませんでしたが、この質問Seg_Durationへの答えを見て、好みの形式で期間を表示できます。

ここでSQLフィドル。

于 2013-10-01T20:14:24.200 に答える