1

timesheetという名前のSQLサーバーテーブルには4つの列があります

employee_id int
task_start_date datetime
task_end_date datetime
hours_worked int

週の開始日と週の終了日、および従業員がその週に働いた合計時間を導出する必要があります。結果のデータセットには4つの列が必要です-Week_Start_DateWeek_End_DateEmployee_Id Total_Hours_Charged

つまり、そのテーブルから、すべての週について各従業員が請求する合計時間を取得する必要があります。誰かが私がそのためのクエリを書くのを手伝ってくれませんか?

4

1 に答える 1

1

SQL Server 2005 以降

仮定:

  1. タスクの開始日と終了日の値は常に同じです。
  2. 週の開始日と終了日は、 task_start_dateに基づいて計算されます。

関数を使用しDATEPARTて特定の日付の曜日を検索し、関数を使用DATEADDして からの出力DATEPARTを入力として提供し、週の最初と最後の曜日を計算できます。

SQL Fiddle でデモを表示するには、ここをクリックしてください。

脚本:

スクリプトは、週が日曜日に始まり土曜日に終わると仮定して、週の合計時間を計算します。

CREATE TABLE timesheet
(
        employee_id     int
  ,     task_start_date datetime
  ,     task_end_date   datetime
  ,     hours_worked    int
);

INSERT INTO timesheet
    (employee_id, task_start_date, task_end_date, hours_worked) 
    VALUES
      (1, '20120331', '20120331', 6),
      (1, '20120401', '20120401', 3),
      (1, '20120403', '20120403', 8),
      (1, '20120409', '20120409', 5),
      (1, '20120412', '20120412', 4),
      (2, '20120402', '20120402', 7),
      (2, '20120403', '20120403', 6),
      (3, '20120409', '20120409', 4),
      (1, '20120412', '20120412', 8);

;WITH empworkhours AS
(
    SELECT  DATEADD(DAY
                ,   -(DATEPART(dw, task_start_date) -1)
                ,   task_start_date) AS week_start
        ,   DATEADD(DAY
                ,   7 - (DATEPART(dw, task_start_date))
                ,   task_start_date) AS week_end
        ,   employee_id
        ,   hours_worked
    FROM    timesheet
)
SELECT      week_start
        ,   week_end
        ,   employee_id
        ,   SUM(hours_worked) total_hrs_per_week
FROM        empworkhours
GROUP BY    week_start
        ,   week_end
        ,   employee_id;

出力:

WEEK_START      WEEK_END        EMPLOYEE_ID TOTAL_HRS_PER_WEEK
--------------  --------------  ----------- -----------------
March, 25 2012  March, 31 2012       1               6
April, 01 2012  April, 07 2012       1              11
April, 01 2012  April, 07 2012       2              13
April, 08 2012  April, 14 2012       1              17
April, 08 2012  April, 14 2012       3               4
于 2012-05-04T20:05:23.477 に答える