2011-08-22 53 views
1

我用合适的方法来在MS SQL下面的查询挣扎2008-SQL查询帮助 - 资源可用性

我有一个表下面的表格追踪员工的项目拨款,主要有:

  • AllocID INT PK
  • 专案编号INT FK
  • EMPLID INT FK
  • AllocPct小数
  • 所有ocStartDate日期时间
  • AllocEndDate日期时间

也就是说,员工被分配到一个指定的时间段和百分比的项目。作为这些数据的一个函数,我试图快速查询员工有可用能力的日期 - 也就是最早的日期,其中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和2013年2月8日。

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

+0

请您提供的样本数据和期望结果的几行?我已经为你重新标记了这个问题(谢谢你提到SQL Server 2008,但它也可以帮助你用这个版本标记问题)。 –

+0

已更新。感谢您的关注。 –

+0

好奇的是,如果AllocStartDate只包含日期,为什么不使用'DATE'而不是'DATETIME2(7)'? –

回答

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