我正在尝试找到员工[ID]和第一个[使用日期],其中[数量]> 4在6个月的时间范围内[UsedDate]。如果员工的工作时间超过6个月,我希望Qty的总和重新开始,但我似乎无法弄清楚如何将这些使用日期仅在6个月内的多行的[数量]相加并且如果没有不适用,从下一个最早的UsedDate开始,看看员工[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之间的日期是&gt; 6个月 员工2应该返回RowD = 1的UsedDate(组中的第一个日期,总和> 4,总天数<6个月) ......员工6应返回UsedDate,其中RowID = 2(组中的第一个日期,总金额> 4,总天数<6个月)
更新 - 也尝试过 按CASE求和,但只返回一列或值,而不是分组行的总和(这是180天对6个月): ,SUM(例如t2.Qty&gt; 4 或(t2.Qty&lt; 5 AND(t1.SumDays IS NULL或t1.SumDAys&lt; 180)) 然后t2.Qty ELSE&#39; 0&#39; END)作为总和
答案 0 :(得分:0)
作为解决方案的一部分,请尝试在SUM中使用CASE语句,类似于
SUM(CASE WHEN UsedDate > dateadd(m,-6,getdate()) THEN q.Qty ELSE 0 END)
我知道这并不能解决你的整个问题,但也许这有助于朝着正确的方向前进。