Я борюсь с подходящим подходом к следующему запросу в MS SQL 2008-
У меня есть таблица, отслеживающая распределения проектов сотрудникам, по существу, в следующей форме:
- AllocID int pk
- ProjectID int fk
- EmplID int fk
- AllocPct десятичное
- AllocStartDate datetime
- AllocEndDate datetime
То есть сотрудник назначается проекту на определенный период времени и проценты.Как функция этих данных, я пытаюсь быстро запросить дату, когда сотрудник имеет доступную емкость, то есть самую раннюю дату, когда SUM (AllocPct) <1. </p>
Я застрял наоснованный на множестве подход к этому запросу, который в идеале может обрабатывать набор сотрудников (т.е. возвращать это поле в виде столбца для всех сотрудников).У меня есть «рабочий» запрос (ниже), который можно использовать для отдельного сотрудника, но это беспорядок (таблица чисел, вложенный и т. Д.);должен быть лучший способ приблизиться к этому.
SELECT MIN(DateDay) AS DateAvailable
FROM (SELECT b.EmplID, a.DateDay, SUM(b.AllocPct) AS SumAllocPct
FROM p_AllocDetailDynView AS b INNER JOIN
(SELECT DATEADD(day, Number - 1, GETDATE()) AS DateDay
FROM master.dbo.Numbers AS n) AS a ON b.AllocEndDate > a.DateDay
WHERE (b.EmplID = @emplID)
GROUP BY a.DateDay, b.EmplID) AS a
WHERE (SumAllocPct < 1)
GROUP BY EmplID
Любые предложения / направления будут с благодарностью.
Спасибо!
Редактировать - вот примерная выборка данных:
AllocDetailID ProjectID EmplID AllocPct AllocStartDate AllocEndDate
6204 32 931 0.50 2011-01-01 00:00:00.0000000 2012-01-01 00:00:00.0000000
6477 64 932 1.00 2011-05-27 00:00:00.0000000 2013-02-08 00:00:00.0000000
6550 12 931 0.50 2011-06-01 00:00:00.0000000 2012-06-01 00:00:00.0000000
Предполагаемые возвращаемые значения для рассматриваемого запроса будут 01.01.2012и 2/8/2013 для сотрудников 931 и 932 соответственно.
Если подумать немного об этом, то «доступная дата» должна действительно применяться только с текущей даты вперед, то есть с прямо сейчас, что являетсяскорей всего, что у этого сотрудника есть какая-то доступность?Надеюсь, что это имеет смысл.