2011-08-22 55 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