2016-11-07 13 views
0

すべての従業員のタスクレコードを持つテーブルがあります。必要な使用時間は、1日あたり9.5(ランチブレークを除く)であり、それを超えるものは未払いの列になります。SQL更新前のレコード

私たちは昼食を空白のままにしていましたが、今は昼食を仕事にする必要があるので、そのランチにある時間/分は9.5の必要なスペクトラムに含まれています。 Now:

  1. ブレークタイムの値を使用済みから未払いに移行するにはどうすればよいですか?
  2. 更新後、未払いの休憩時間を未払いの最後の仕事に差し引くことができ、それを1週間に必要な9.5時間を完了するためにスプリントウォーズに移動するにはどうすればよいですか? ありがとうございます。

enter image description here

答えて

-1
UPDATE Your_table_name SET unpaid = spent 
WHERE unpaid = 0 AND TaskName = 'Break Time' 
+0

'Where TaskName = '休憩時間' – JimmyB

0

これはトリッキーな作業であり、そして、あなたのテーブルには、多くのレコードが含まれている場合、パフォーマンスが悪くなることを良いチャンスがあります。その場合は、テーブルをパーティション化するフィールド(UserId?)でバッチで更新を実行することを検討することがあります。

時間がUnpaidSpentフィールドに休憩に費やし、その後、休憩のために0SpentHoursを設定し、あなたのテーブルが#taskRecordと呼ばれる最初のコピーと仮定すると:

Update #taskRecord 
    Set UnpaidSpent = SpentHours 
    Where TaskName = 'Break Time'; 

Update #taskRecord 
    Set SpentHours = 0 
    Where TaskName = 'Break Time'; 

その後、我々はしている行を特定する必要があります未払いの時間がある毎日の最初の行(昼休みの行を除く)。その日に9.5時間の勤務時間をまだ積算していない場合は、未払額から有料の勤務時間に時間を移してください。

With runningTotalHours As (
    Select UserID, WorkDateTime = WorkDate, WorkDate = Convert(date, WorkDate), SpentHours, UnpaidSpent, TaskName, 
     Sum(SpentHours + UnpaidSpent) Over (Partition By UserId, Convert(date, WorkDate) 
              Order By WorkDate 
              Rows Between Unbounded Preceding And Current Row) As RunningTotalAll, 
     Sum(SpentHours) Over (Partition By UserId, Convert(date, WorkDate) 
           Order By WorkDate 
           Rows Between Unbounded Preceding And Current Row) As RunningTotalPaid 
     from #taskRecord 
     Where TaskName <> 'Break Time'), 
RowsWithUnpaidHours As (
    Select UserID, WorkDateTime, WorkDate, SpentHours, UnpaidSpent, TaskName, RunningTotalAll, RunningTotalPaid, 
     Row_Number() Over (Partition By UserId, WorkDate Order By WorkDateTime) As RowNo 
     From runningTotalHours 
     Where UnpaidSpent <> 0) 
Update RowsWithUnpaidHours 
    Set SpentHours = CASE WHEN RunningTotalAll < 9.5 Then SpentHours + UnpaidSpent 
         ELSE SpentHours + 9.5 - RunningTotalPaid END, 
    UnpaidSpent = CASE WHEN RunningTotalAll < 9.5 Then 0 
         ELSE UnpaidSpent - 9.5 + RunningTotalPaid END 
    Where RowNo = 1 And RunningTotalPaid <> 9.5; 

一貫性を確保するために、これは毎日の最初の行のみを未払いの時間で更新します。しかし、1日の終わりに無給時間に複数の仕事をしていた人が、昼食時間を取った後に支払われると考えられる日があるかもしれません。したがって、それ以上の調整がないことを示す(0 row(s) affected)が報告されるまで、上記のステートメントを複数回実行する必要があります。

+0

これは完全に機能しました!ありがとうございました:) – SongJoongKi01

+0

@ SongJoongKi01それがうまくいっていることを聞いて嬉しいです。完全性と将来の読者を助けるために、あなたの質問に完全に答えるならば、その答えをAcceptedとすることができますか? – mendosi

関連する問題