2013-06-04 8 views
0

У меня есть таблица:значения суммы в зависимости от даты

Date, HoursToWork, Workers_ID, Contract_ID, ContractStartDate

Моя цель заключается в суммировать все часы для текущего договора, поскольку договор может меняться каждый день года дата идет от 01.01. - 31.12 .. Возможны «n» контракты. Мы можем работать с Contract_ID (если имеется более одного ID, самый высокий ID всегда является текущим контрактом) или с ContractStartDate. Созданная таблица i (см. Выше) имеет следующую структуру: если у работника есть два контракта, у него есть две записи для каждой даты. Один для контракта 1 и один для контракта 2. Например.

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

Assumend работник работает 8 часов в день (не думая об отдыхе или так) мы могли бы добавить до 8 часов каждый рабочий день до 02.05.2013. Теперь контракт меняется, и он работает 4 часа в день, и мы начинаем добавлять к уже собранным часам 4 часа за каждый рабочий день до конца года.

+1

И ваш вопрос ...? –

+0

«Моя цель состоит в том, чтобы суммировать все часы для контракта CURRENT», я не знаю, как этого достичь. – ruedi

+0

Для указанного работника? Для всех работников? Вы хотите резюме для каждого работника? Отличная сумма для всех работников? Существует ли отдельная таблица контрактов? что ты уже испробовал? –

ответ

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() назначает порядковый номер каждой строке для каждого работника (из-за пункт . The first row is the one with the highest contract id (because of the order by` clause).

+0

отлично, это именно то, что мне нужно, и я также изучил новые команды. после того, как я понял, мне просто нужно было добавить 'partition by workers_ID, Date' для моих целей. Большое спасибо! – ruedi

0

Try:

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 
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 

См fiddler

Смежные вопросы