按年份和月份选择总计数()组?

时间:2013-08-26 16:49:10

标签: sql sql-server sql-server-2005 count group-by

例如想象下面的表格

select accountid, createdon from account

73C56F61-5FF1-E111-A4F8-005056977FBC    2012-08-28 22:26:47.000
A7C56F61-5FF1-E111-A4F8-005056977FBC    2012-08-28 22:26:48.000
B7C56F61-5FF1-E111-A4F8-005056977FBC    2012-08-28 22:26:48.000
FBC56F61-5FF1-E111-A4F8-005056977FBC    2012-08-28 22:26:49.000
CBC66F61-5FF1-E111-A4F8-005056977FBC    2012-08-28 22:26:54.000
87C66F61-5FF1-E111-A4F8-005056977FBC    2012-08-28 22:26:53.000
53C76F61-5FF1-E111-A4F8-005056977FBC    2012-08-28 22:26:55.000
87C76F61-5FF1-E111-A4F8-005056977FBC    2012-08-28 22:26:56.000
2ED89924-5CFC-E111-A4F8-005056977FBC    2012-09-11 22:01:51.000
C0D79924-5CFC-E111-A4F8-005056977FBC    2012-09-11 22:01:49.000

然后在2012年1月,该计数是10个具有此查询的帐户

select count(*) from account

假设我在2012年2月有5个新帐户,然后在2012年2月查询count(*)会返回15个帐户。如果我在2012年3月有10个新帐户,那么在2012年3月查询count(*)总共会返回35个帐户。

我想得到以下结果

2012-january-10 accounts
2012-febrary-15 accounts
2012-march-  35 accounts
表帐户中的

创建日期是日期,

但如果我这样做了查询

select year(createdon), month(createdon), count(*) quantity
from accounts
group by year(createdon), month(createdon)

我得到以下结果:

2012-january-10 accounts
2012-febrary-5 accounts
2012-march-  20 accounts

然后如何通过简单查询获得第一个结果?不循环

1 个答案:

答案 0 :(得分:4)

你需要滚动总数。在SQL Server中有几种方法(参见Calculate a Running Total in SQL Server),但对于SQL 2005,最简单(非最快)的方式是自联接

with cte as (
    select
        datename(year, createdon) + '-' + datename(month, createdon) as name,
        convert(nvarchar(6), createdon, 112) as grp,
        count(*) as cnt
    from account
    group by
        datename(month, createdon), datename(year, createdon),
        convert(nvarchar(6), createdon, 112)
)
select
    c1.name, sum(c2.cnt) as cnt
from cte as c1
    inner join cte as c2 on c2.grp <= c1.grp
group by c1.name

sql fiddle demo