2014-12-04 62 views
0

我發現了大量類似於我正在嘗試做的文章,但似乎無法複製它的工作。 我有一個交易表,它是如下:按月運行開放賬戶SQL Server 2008總計

AccountNo Status DateComplete DateDue State 
1147331  OPEN 18/02/2011  10/03/2011 R 
1146787  OPEN 07/04/2011  05/04/2011 R 
16511  OPEN 29/09/2003  29/09/2003 R 
22571  OPEN 15/10/2003  15/10/2003 R 
2852403  OPEN 10/11/2014  10/11/2014 R 
2851890  OPEN 17/11/2014  17/11/2014 R 
1147331  CLOSED 24/06/2011  27/06/2011 R 
1146787  CLOSED 14/06/2011  14/06/2011 R 
2852403  CLOSED 11/08/2015  11/08/2015 F 
2851890  CLOSED 18/08/2015  18/08/2015 F 

我沒有獲得更改任何數據,以便與我有什麼工作。狀態欄顯示狀態是否完成或掛起。所以當它是'F'時,它將有一個未來日期,因此我使用了一個CASE WHEN State = 'F' THEN DateDue WHEN State = 'R' THEN DateComplete END AS Date語句(如果語法不在其例子中,請原諒我)。 我試圖實現的是按月開放帳戶的運行總數。我已經找到了按月累計計數的指南,但無法逐個查找累計計數。我需要的最終輸出是(不是基於上述數字)

Month OpenAccounts 
Jan-14 1 
Feb-14 3 
Mar-14 2 
Apr-14 5 

會愉快地回答任何問題如果我不清楚。 (刪除原文後,我不得不重新發布這個問題)。

回答

0
;with CTE as -- Get all dates with month year combo 
(select CASE [STATE] WHEN 'F' THEN DateDue 
         WHEN 'R' THEN DateComplete END AS TransDate   
from @Account 
where Status = 'OPEN' 
) 
select DATENAME(mm,T1.TransDate) +'-'+ 
     CAST (YEAR(T1.TransDate) AS VARCHAR(20)) AS Month, 
     count(distinct T2.TransDate) as runsum 
from CTE as T2 
cross join CTE T1 
where 1= case when DATENAME(mm,T1.TransDate) +'-'+ 
        CAST (YEAR(T1.TransDate) AS VARCHAR(20)) = 
        DATENAME(mm,T2.TransDate) +'-'+ 
        CAST (YEAR(T2.TransDate) AS VARCHAR(20)) 
        and T2.TransDate < T1.TransDate then 1 
       when T2.TransDate <= T1.TransDate then 1 
     end 
group by DATENAME(mm,T1.TransDate) +'-'+ 
     CAST (YEAR(T1.TransDate) AS VARCHAR(20)) 
order by runsum asc 

DEMO

+0

感謝您的回答,但我不能似乎得到這跟我的數據工作,因爲它不出現,以配合我使用的數據? – GPH 2014-12-04 11:08:52

+0

請分享總數錯誤的行。 – Deepshikha 2014-12-04 11:11:51

+0

在您的CTE中,您的初始選擇查詢僅引用開放帳戶。這意味着你忽略了已關閉的帳戶。沒有辦法確定帳戶何時關閉?我需要知道每個月有多少帳戶是開放的。不是累計總數。如果在1月份有2個賬戶,那麼另外4個在feb中打開,那麼會給出6個。但是如果3個賬戶在feb中關閉,那麼會減少3個賬戶.. – GPH 2014-12-04 11:14:12

0

試試這個:

DECLARE @table TABLE 
    (
    mon   INT, 
    yr   INT, 
    cnt   INT, 
    runningtotal INT 
) 
DECLARE @runningtotal INT 

INSERT INTO @table 
      (mon, 
      yr, 
      cnt) 
SELECT Datepart(MONTH, yourcolumn) AS mon, 
     Datepart(YEAR, yourcolumn) AS yr, 
     Count(*)     cnt 
FROM yourtable 
GROUP BY Datepart(MONTH, yourcolumn),Datepart(YEAR, yourcolumn) 

UPDATE @table 
SET @runningtotal = @runningtotal + cnt, 
     runningtotal = @runningtotal 

SELECT mon, 
     yr, 
     runningtotal 
FROM @table