SQL中日期列的6个月内按ID分组的列的最有效方法是什么?

时间:2014-12-02 19:04:59

标签: sql sql-server loops cursor sum

我正在尝试找到员工[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)作为总和

1 个答案:

答案 0 :(得分:0)

作为解决方案的一部分,请尝试在SUM中使用CASE语句,类似于

SUM(CASE WHEN UsedDate > dateadd(m,-6,getdate()) THEN q.Qty ELSE 0 END) 

我知道这并不能解决你的整个问题,但也许这有助于朝着正确的方向前进。