2

Microsoft Access に保持されているデータベースから、従業員がタスクにどのくらいの時間を費やしているかを判断するように依頼されました。基本的に、テーブルには、従業員 ID、タスク ID (ジョブ番号)、ステータス (ジョブ開始の場合は 1、ジョブ終了の場合は 2)、およびイベントの日時が含まれます。

どの仕事にも 1 人しか取り組むことができず、一度開始すると、次のタスクを開始する前にそのタスクを終了する必要があります。データベースのエントリは次のようになります

EmpID          TaskID        TaskStatus       TaskDate
1              A001          1                15/09/12 09:00
2              A023          1                15/09/12 09:00
1              A001          2                15/09/12 09:30
3              A011          1                15/09/12 09:35
3              A011          2                15/09/12 09:45
1              A016          1                15/09/12 09:45
2              A023          2                15/09/12 09:45
..

を示すレポートを作成する必要があります。

EmpID          TaskID        Time Take
1              A001          0:30
2              A023          0:45
3              A011          0:10

これに加えて、指定された期間よりも短い時間で完了したタスクのみをリストする必要があります (迅速に完了したジョブで品質基準が満たされていることを確認するために使用されます)。

すべての助けを感謝して受け取りました。

4

2 に答える 2

1

このクエリは、それぞれの期間を分単位で提供しますTaskID。未完了のタスク ( の行がないTaskStatus=2) は、期間として Null を返します。INNER JOIN未完了のタスクを除外したい場合は、代わりに使用できます。

SELECT
    strt.EmpID,
    strt.TaskID,
    DateDiff('n',strt.TaskDate,stp.TaskDate) AS minutes_taken
FROM
    YourTable AS strt
    LEFT JOIN (
            SELECT TaskID, TaskDate
            FROM YourTable
            WHERE TaskStatus=2
        ) AS stp
    ON strt.TaskID = stp.TaskID
WHERE strt.TaskStatus=1;

「どの仕事にも取り組むことができるのは 1 人の個人だけであり、いったん開始すると、別の仕事を開始する前にタスクを終了しなければならないTaskID」ため、参加条件にのみ使用したことに注意してください。私の解釈が間違っている場合は、条項を変更してください。ON

そのクエリに基づいて別のクエリを作成し、結果をフィルタリングしますminutes_taken

PARAMETERS target Short;
SELECT
    sub.EmpID
    sub.TaskID
    sub.minutes_taken
FROM
    (
        SELECT
            strt.EmpID,
            strt.TaskID,
            DateDiff('n',strt.TaskDate,stp.TaskDate) AS minutes_taken
        FROM
            YourTable AS strt
            LEFT JOIN (
                    SELECT TaskID, TaskDate
                    FROM YourTable
                    WHERE TaskStatus=2
                ) AS stp
            ON strt.TaskID = stp.TaskID
        WHERE strt.TaskStatus=1
    ) AS sub
WHERE sub.minutes_taken < target;
于 2012-10-10T10:13:22.980 に答える
0

このようなことを試してください:

これは SQL サーバーの構文です。ms アクセスに変換する必要があります。変換する必要があるのは、数値を文字列に変換するキャスト関数だけだと思います

 select t1.EmpID,
        t1.TaskID,
        cast(datediff('n',t1.TaskDate,t2.TaskDate)/60 as varchar(10))+' : '+
        cast(datediff('n',t1.TaskDate,t2.TaskDate)%60 as char(2)) as TimeTaken
 from   table1 t1
 inner join   table1 t2
 on     t1.EmpID=t2.EmpID
 and    t1.TaskID=t2.TaskID
 where  t1.TaskStatus=1
 and    t2.TaskStatus=2


SQL フィドルのデモ

于 2012-10-10T09:02:19.537 に答える