我試圖在6個月的時間範圍內[數量]> 4 [員工數量]和第一個[使用日期] [UsedDate]。如果僱員的工作時間超過6個月,我希望重新開始數量的總和,但我似乎無法弄清楚如何計算多個行的數量[Qty],其中這些使用日期僅在6個月的時間內,如果這樣不適用,從下一個最早的UsedDate開始,查看員工[ID]是否符合標準。在SQL的日期列的6個月內總結按ID分組的列的最有效方法是什麼?
我最初在第二部分中有第一個查詢,但它不會以這種方式識別[UsedStartDate]和[UsedEndDate]。我確定我做錯了所以我把它分解出來,但SUM或者返回所有行的總數(不是我想要的)或者該行的總和(也不是我想要的)。
SELECT ID
,RowID
,UsedDate
,Qty
,UsedStartDate = UsedDate
,UsedEndDate = DATEADD(month, +6, UsedDate)
INTO #DateRange
FROM #CrazyMath
;WITH Used1 AS (SELECT ID
,RowID
,UsedDate
,RowNum = ROW_Number() OVER(ORDER BY ID, RowID) FROM #CrazyMath)
-- order (needed?)
SELECT q.ID
--,q.RowID
--,q.UsedDate
--,UsedStartDate
--,UsedEndDate
,SUM(q.Qty) OVER(PARTITION BY a.ID
--, a.UsedDate
ORDER BY a.ID
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS sumqty FROM #CrazyMath q
INNER JOIN #DateRange a
ON a.ID = q.ID AND a.RowID = q.RowID
Output:
ID Row UsedDate Qty SumQty
1 1 2/12/2013 4 4
1 2 10/30/2013 4 8
1 3 7/30/2014 4 12
2 1 7/9/2012 1 1
2 2 7/17/2012 1 2
2 3 8/3/2012 1 3
2 4 8/27/2012 1 4
2 5 9/24/2012 1 5
2 6 10/12/2012 1 6
3 1 2/11/2014 4 4
4 1 10/17/2003 4 4
4 2 11/17/2003 4 8
4 3 12/18/2003 4 12
4 4 1/14/2004 4 16
4 5 2/6/2004 4 20
4 6 2/26/2004 4 24
4 7 3/25/2004 4 28
5 1 8/31/2010 1 1
5 2 9/7/2010 1 2
5 3 9/23/2010 2 4
6 1 10/29/2003 3 3
6 2 6/5/2006 8 11
6 3 6/25/2006 8 19
6 4 7/25/2006 8 27
6 5 8/24/2006 8 35
6 6 9/18/2006 8 43
6 7 11/14/2006 8 51
6 8 12/7/2006 8 59
6 9 12/19/2006 8 67
僱員1不應該總結,因爲每個UsedDate之間的DATEDIFF是> 6個月 僱員2應該返回UsedDate其中行ID = 1(在組第一日期其中總和> 4且總天數< 6個月) ...員工6應返回UsedDate其中行ID = 2(在組第一日期其中總和> 4且總天數< 6個月)
更新 - 通過CASE也嘗試 薩姆但將僅返回列或值,而不是分組行的總和(這是180天比6個月): ,SUM(CASE WHEN t2.Qt Y> 4 OR(t2.Qty < 5 AND(t1.SumDays爲空或t1.SumDAys < 180)) THEN ELSE t2.Qty '0' END),爲總和
謝謝。我只是更新,我已經嘗試過,也許這就是我寫它的方式,但它返回CASTY子句dateadd中Qty的值而不是多個Qty行(每個員工)的總和。例如:ID 1;總和4 ID 1; Sum 0 ID 1; Sum 0 – Cams42 2014-12-02 19:30:13
嗯是的,現在有道理。有一段時間沒有寫過其中之一;-)。 CASE聲明需要提交給CTE。 – sfuqua 2014-12-02 20:54:48