2013-11-18 3 views
0

У меня есть отчет, который определяет сотрудников, которые вступили менее 40 часов на их табелей для конкретной недели:Адаптация SQL для работы над несколькими недель

With Under40s as (
Select Distinct Entry.UUID, Entry.FirstName, Entry.LastName, Team.PersonUnit, Team.TeamName 
From Entry as Entry 
Inner Join TeamOrganization as Team on Team.PersonUUID = Entry.UUID and @EnteredDate  between Team.PeriodBeginDate and Team.PeriodEndDate 
Where 
(
    Select sum(Entry2.Hours) From Entry as Entry2 
    Where Entry2.UUID = Entry.UUID and Entry2.Date Between @StartDate and @EndDate 
) < 40 
Or not exists 
(
    Select 1 From Entry as Entry2 
    Where Entry2.UUID = Entry.UUID and Entry2.Date Between @StartDate and @EndDate 
) 
) 
Select distinct Under40s.UUID, Under40s.FirstName, Under40s.LastName, Under40s.PersonUnit, Under40s.TeamName, Case 
    When Sum(Entry.Hours) is null then 0 
    Else Sum(Entry.Hours) 
    End as TotalHours 
From Under40s 
Left Join Entry as Entry on Entry.UUID = Under40s.UUID and Entry.Date Between @StartDate and @EndDate 
Where Under40s.PersonUnit in (@PersonUnit) and Under40s.TeamName in (@Teams) 
Group By Under40s.UUID, Under40s.FirstName, Under40s.LastName, Under40s.PersonUnit, Under40s.TeamName 
Order By Under40s.LastName, Under40s.FirstName 

Теперь клиент хочет, чтобы иметь возможность ввести дату диапазон более чем на неделю. Я думаю, что они хотят видеть каждую неделю в пределах этого диапазона дат, который сообщает менее 40 часов. Я не уверен, как, или если, я могу изменить SQL для доставки такого отчета. Может ли кто-нибудь дать мне подсказку?

Спасибо!

+0

Вы используете службы отчетов для отображения результатов этого cte? – JsonStatham

+0

@SelectDistinct: Да, я. –

ответ

0

Предполагая, что каждый рабочий день составляет 8 часов, одним из вариантов было бы получить разницу в день между датой начала и конечной датой, а затем умножить это на 8 и использовать продукт в качестве критериев. Например: startdate: 20/11/2013 и enddate: 31/12/2013 - это 41 день, включая выходные (так что вы также должны фильтровать выходные или нерабочие дни), но точно так же, как пример 41 * 8 = 328. Итак вместо менее 40 будет меньше 328. Вот ссылка на рабочее решение для исключения выходных и других указанных дат: Number of days in date range, excluding weekends and other dates, in C#

+0

Я думаю, что это действительно так: за период с 10/28/2013 по 11/17/2013 сотрудник 1 сообщил 20 часов на 1-й неделе, сотрудник 2 сообщил 35 часов на неделе 2, а сотрудник 3 сообщил 15 часов в неделю 1 и 29 часов на неделе 2. Я просто не уверен, как это сделать. Я не уверен, что это действительно возможно. –

+0

А я вижу, если это то, что они хотят, я думаю, что он может получить недели, а затем каждую неделю дату начала и окончания и так далее. – zulq

+0

Как бы вы это сделали с прямым SQL? –

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