2014-12-04 60 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