0

私はテーブルを持っています:

Date, HoursToWork, Workers_ID, Contract_ID, ContractStartDate

私の目標は、現在の契約のすべての時間を合計することです。契約は、日付が 01.01 から毎年変更される可能性があるためです。- 31.12.. 「n」個の契約が可能です。Contract_ID (複数の ID がある場合、最も高い ID が常に現在の契約です) または ContractStartDate を使用できます。私が作成したテーブル (上記を参照) は次のような構造になっています: 労働者が 2 つの契約を結んでいる場合、各日付に 2 つのエントリがあります。1 つは契約 1 用、もう 1 つは契約 2 用です。

01-01-2013, 8, 1, 1, 01.01.2013
01-01-2013, 4, 1, 2, 03.05.2013

従業員が 1 日 8 時間 (休日などを考えずに) 働いていると仮定すると、2013 年 2 月 5 日までのすべての勤務日に合計 8 時間かかることになります。現在、契約が変更され、彼は 1 日 4 時間働いており、すでに収集されている時間に、年末までのすべての勤務日に 4 時間を追加し始めます。

4

3 に答える 3

0

あなたの明確化は、ユーザーがこれを望んでいるということです。現在の契約を取得するには、各ユーザーの最新の契約を使用row_number()して選択します。ContractId次に、集計を行います。

select workers_id, ContractId, ContractStartDate, SUM(HoursToWork)
from (select t.*,
             ROW_NUMBER() over (partition by Workers_Id order by Contract_id desc) as seqnum
      from t
     ) t
where seqnum = 1
group by workers_id, ContractId, ContractStartDate;

where Workers_ID = @Workers_Idプロセスでこれを使用するには、現在のワーカーを選択するようなものが必要になります。

関数はrow_number()、各ワーカーの各行に連続番号を割り当てます (partition by. The first row is the one with the highest contract id (because of theorder by` 句のため)。

于 2013-06-04T15:19:13.277 に答える
0

私はこれがうまくいくはずだと思います:

select Workers_ID, sum(CASE WHEN dt1 is null THEN dt2 ELSE dt1 END) from
(select Workers_ID,

   DATEDIFF(DAY,
            ContractStartDate,
            (select top 1 ContractStartDate from yourTable t2
                where t2.Workers_ID=t1.Workers_ID 
                and t2.ContractStartDate>t1.ContractStartDate)
           )  * HoursToWork as dt1,
   DATEDIFF(DAY,
            ContractStartDate,
            GetDate()
           )  * HoursToWork as dt2               
from yourTable t1) a
group by Workers_ID

フィドラーを参照

于 2013-06-04T15:35:39.577 に答える
0

試す:

select sum(h.HoursToWork)
from (select max(contract_ID) contract_ID
      from contracts_table
      where XXX=workers_ID) c
join hours_table h on c.contract_ID = h.contract_ID
于 2013-06-04T15:14:58.230 に答える