0

従業員のタイムシートを管理するアプリケーションがあります。

私のテーブルは次のようになります。

TIMESHEET
  TIMESHEET_ID
  EMPLOYEE_ID
  etc

TIMESHEET_DAY:
  TIMESHEETDAY_ID
  TIMESHEET_ID
  DATE_WORKED
  HOURS_WORKED

各タイムシートは 14 日間をカバーするため、TIMESHEET レコードごとに 14 の TIMESHEET_DAY レコードがあります。また、誰かが休暇を取った場合、その 14 日間に勤務時間がなければ、タイムシートを入力する必要はありません。

ここで、従業員に過去 6 か月間で 7 日間の欠勤があるかどうかを判断する必要があります。つまり、0 時間の TIMESHEET_DAY レコードが 7 つ連続しているか、レコードが提出されていないものと 0 時間労働で提出されたレコードの組み合わせがある 7 日間の期間のいずれかを探す必要があります。その場合、最後の TIMESHEET_DAY レコードの DATE_WORKED と時間を知る必要があります。

アプリケーションはasp.netなので、すべてのTIMESHEET_DAYレコードを取得して反復処理できましたが、SQLでこれを行うより効率的な方法が必要だと思います.

4

2 に答える 2

1
SELECT t1.EMPLOYEE_ID, t1.TIMESHEETDAY_ID, t1.DATE_WORKED
FROM (SELECT ROW_NUMBER() OVER(PARTITION BY  EMPLOYEE_ID, TIMESHEETDAY_ID ORDER BY DATE_WORKED) AS RowNumber,
            EMPLOYEE_ID, TIMESHEETDAY_ID, DATE_WORKED
      FROM (SELECT EMPLOYEE_ID, TIMESHEETDAY_ID, DATE_WORKED       
            FROM  TIMESHEET_DAY d
                  INNER JOIN TIMESHEET t ON t.TIMESHEET_ID = d.TIMESHEET_ID
            GROUP BY EMPLOYEE_ID, TIMESHEETDAY_ID, DATE_WORKED
            HAVING SUM(HOURS_WORKED) > 0) t ) t1
     INNER JOIN      
     (SELECT ROW_NUMBER() OVER(PARTITION BY  EMPLOYEE_ID, TIMESHEETDAY_ID ORDER BY DATE_WORKED) AS RowNumber,
            EMPLOYEE_ID, TIMESHEETDAY_ID, DATE_WORKED
      FROM (SELECT EMPLOYEE_ID, TIMESHEETDAY_ID, DATE_WORKED       
            FROM  TIMESHEET_DAY d
                  INNER JOIN TIMESHEET t ON t.TIMESHEET_ID = d.TIMESHEET_ID
            GROUP BY EMPLOYEE_ID, TIMESHEETDAY_ID, DATE_WORKED
            HAVING SUM(HOURS_WORKED) > 0) t ) t2 ON t1.RowNumber = t2.RowNumber + 1
WHERE t2.DATE_WORKED - t1.DATE_WORKED >= 7 
于 2012-01-27T16:11:48.100 に答える
0

タイムシートごとに日数を数えることで、SQL を使用して少なくとも部分的に実行し、残りのロジックをプログラムで実行します。これは、欠落している日があるタイム シートを識別します。

SELECT * FROM
    (SELECT s.timesheet_id, SUM(CASE WHEN d.hours_worked > 0 THEN 1 ELSE 0 END) AS days_worked
    FROM
        TimeSheet s
        LEFT JOIN TimeSheet_Day d
            ON s.timesheet_id = d.timesheet_id
    GROUP BY
        s.timesheet_id
    HAVING SUM(CASE WHEN d.hours_worked > 0 THEN 1 ELSE 0 END) < 14) X
    INNER JOIN TimeSheet
        ON TimeSheet.timesheet_id = X.timesheet_id
    LEFT JOIN TimeSheet_Day
        ON TimeSheet.timesheet_id = TimeSheet_Day.timesheet_id
    ORDER BY
        TimeSheet.employee_id, TimeSheet.timesheet_id, TimeSheet_Day.date_worked
于 2012-01-27T15:58:58.820 に答える