我正在努力使用适当的方法来解决MS SQL 2008中的以下查询 -
我有一个跟踪员工项目分配的表,基本上采用以下形式:
即,将员工分配到指定时间段和百分比的项目。作为这些数据的一个功能,我试图快速查询员工可用容量的日期 - 即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。
考虑到这一点,“可用日期”应该只适用于当前的日期 - 也就是说,从现在开始,这个员工有多少可用性是最快的?希望这是有道理的。
答案 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