Справка по SQL-запросам - Доступность ресурсов - PullRequest
1 голос
/ 23 августа 2011

Я борюсь с подходящим подходом к следующему запросу в 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 соответственно.

Если подумать немного об этом, то «доступная дата» должна действительно применяться только с текущей даты вперед, то есть с прямо сейчас, что являетсяскорей всего, что у этого сотрудника есть какая-то доступность?Надеюсь, что это имеет смысл.

1 Ответ

0 голосов
/ 23 августа 2011

Я почти уверен, что это будет работать:

;WITH
    cteChange_Dates AS
(
   -- "change dates" are the start and end dates for any selected employee
    SELECT EmplID, AllocPct, 1.00 As Start, AllocStartDate   As ChangeDate
    FROM p_AllocDetailDynView
  UNION
    SELECT EmplID, AllocPct, 0.00 As Start, AllocEndDate     As changeDate
    FROM p_AllocDetailDynView
)
SELECT 
    EmplID,
    ChangeDate,
    SUM(AllocPct * Start) As TotalAllocPct
FROM
    cteChange_Dates
GROUP BY
    EmplID,
    ChangeDate
HAVING
    SUM(AllocPct * Start) < 1.00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...