2016-08-23 91 views
2

我正在使用SQL Server 2012並有一個查詢,我需要將其轉換爲每月運行的總數。如何計算具有多個日期條件的運行總計列數

當前查詢預計日期的輸入參數和輸出的所有組,每組共爲輸入年月日

DECLARE @InputDate DATETIME 
SET MonthEndDate = '2016/07/31' 

SELECT P.GroupID,Count(P.PersonID) as GroupTotal 
from PersonData P 
WHERE 
    P.StartedDate IS NOT NULL 
AND P.StartedDate < @InputDate 
AND (
    P.OutcomeDate > @InputDate 
    OR P.OutcomeDate IS NULL 
) 
GROUP BY P.GroupID 

使用相同的查詢邏輯我現在需要重新填充每月的歷史數據,以便我需要在所有月份使用Running Total,例如(2016/01/01,2016/02/01,2016/03/01等),而不是一個具體的月份

我可以做到這一點,如果有一個日期標準例如對於StartedDate 例如

SELECT P.*, 
SUM(GroupTotal) OVER (PARTITION BY GroupID ORDER BY StartedMonth) AS RunningTotal 


FROM (
     SELECT P.GroupID,LEFT(CONVERT(VARCHAR, P.StartedDate, 112), 6) as StartedMonth,Count(P.PersonID) as GroupTotal 
     from PersonData P 
     WHERE 
      P.StartedDate IS NOT NULL 

     GROUP BY P.GroupID,LEFT(CONVERT(VARCHAR, P.StartedDate, 112), 6) 
    ) P 
    ORDER BY GroupID,StartedMonth 

但我原來的查詢有兩個日期的標準不只是一個

1. P.StartedDate < @InputDate 
2. P.OutcomeDate > @InputDate or P.OutcomeDate IS NULL 

是否有可能寫一個有一個以上的日期標準運行總

編輯查詢:

這裏是輸入PersonData表的示例

PersonID,GroupID,StartedDate,OutcomeDate 
1,1001,'2016/05/08',null 
2,1001,'2016/05/04','2016/08/03' 
3,1001,'2016/06/04','2016/08/03' 
4,1001,'2016/07/04','2016/07/07' 
5,1001,'2016/07/04','2016/08/08' 
6,1001,'2016/08/04','2016/09/03' 
7,1001,'2016/08/04','2016/09/03' 
8,1001,'2016/09/04','2016/09/08' 

期望輸出

GroupId,EndMonthDate,MonthCount, RTMonthCount 
1001,'2016/05/31', 2, 2 
1001,'2016/06/30', 1, 3 
1001,'2016/07/31', 1, 4 
1001,'2016/08/31', 2, 6 
1001,'2016/09/31', 0, 6 

因此,在上面的例子中可以看到的人ID 4 & 8不計爲只無1匹配的標準但不是標準沒有2.

+1

請出示樣本數據和預期的結果,並與它 – TheGameiswar

+0

解釋沿着我添加了一個例子 – devc2

+0

但看根據您的標準,PersonID 6和7也將被排除,因爲它們不符合日期標準,對嗎? –

回答

0

如何類似下面,你需要的PARTITION BY(組ID,StartedMonth)計算總每月,併爲運行總,做行之間UNBOUNDED PRECEDING AND CURRENT ROW)

SELECT P.*, 
SUM(GroupTotal) OVER (PARTITION BY GroupID, StartedMonth) AS MonthTotal, 
SUM(GroupTotal) OVER (PARTITION BY GroupID ORDER BY StartedMonth ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS RunningTotal 
FROM (
     SELECT P.GroupID,LEFT(CONVERT(VARCHAR, P.StartedDate, 112), 6) as StartedMonth,Count(P.PersonID) as GroupTotal 
     from PersonData P 
     WHERE 
      P.StartedDate IS NOT NULL 

     GROUP BY P.GroupID,LEFT(CONVERT(VARCHAR, P.StartedDate, 112), 6) 
    ) P 
    ORDER BY GroupID,StartedMonth 

退房這個環節也:Calculate a Running Total in SQL Server

**第二個版本,增加了一個條件的子查詢

SELECT P.*, 
SUM(GroupTotal) OVER (PARTITION BY GroupID, StartedMonth) AS MonthTotal, 
SUM(GroupTotal) OVER (PARTITION BY GroupID ORDER BY StartedMonth ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS RunningTotal 
FROM (
     SELECT P.GroupID,LEFT(CONVERT(VARCHAR, P.StartedDate, 112), 6) as StartedMonth,Count(P.PersonID) as GroupTotal 
     from PersonData P 
     WHERE 
      P.StartedDate IS NOT NULL 
      AND (P.OutcomeDate IS NULL OR (P.OutcomeDate> EOMONTH(P.StartedDate)))  
     GROUP BY P.GroupID,LEFT(CONVERT(VARCHAR, P.StartedDate, 112), 6) 
    ) P 
    ORDER BY GroupID,StartedMonth 
+0

你沒看過我的問題。我可以做這個。我不確定它使用兩個日期標準。 OutcomeDate不在你的答案中。 – devc2

+0

那麼你的StartedMonth會在你的問題中扮演@InputDate的角色?我理解這個權利嗎? – DVT

+0

如果我明白這一次是正確的,那麼它只是在內部查詢中限制所需的行,您可以使用額外條件「AND(P.OutcomeDate IS NULL OR(P.OutcomeDate> EOMONTH(P.StartedDate )))」 – DVT