SQL查询帮助 - 资源可用性

时间:2011-08-22 21:58:45

标签: sql sql-server sql-server-2008

我正在努力使用适当的方法来解决MS SQL 2008中的以下查询 -

我有一个跟踪员工项目分配的表,基本上采用以下形式:

  • AllocID int pk
  • ProjectID int fk
  • EmplID int fk
  • AllocPct decimal
  • AllocStartDate datetime
  • AllocEndDate datetime

即,将员工分配到指定时间段和百分比的项目。作为这些数据的一个功能,我试图快速查询员工可用容量的日期 - 即SUM(AllocPct)<的最早日期。 1。

我坚持使用基于集合的方法来处理这个查询,理想情况下可以处理一组员工(即将此字段作为所有员工的列返回)。我有一个“工作”查询(下面),可用于个别员工,但它是一个烂摊子(数字表,嵌套等);必须有一个更好的方法来解决这个问题。

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

有问题的查询的预期回报值将分别为员工931和932的1/1/2012和2/8/2013。

考虑到这一点,“可用日期”应该只适用于当前的日期 - 也就是说,从现在开始,这个员工有多少可用性是最快的?希望这是有道理的。

1 个答案:

答案 0 :(得分:0)

我很确定这会奏效:

;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
相关问题