2013-08-26 4 views
5

Например представить себе таблицу, как показано нижевыбрать общее количество() по году и месяцу?

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 года граф был 10 счетов с этим запросом

select count(*) from account 

Скажем, у меня есть 5 новых счетов в феврале 2012 года, а затем запрашивая count(*) в Февраль 2012 года возвращает 15 учетных записей. Если в марте 2012 года у меня есть 10 новых учетных записей, тогда запрос count(*) в марте 2012 года возвращает 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 

, то как я могу получить первый результат с помощью простого запроса? не петли

ответ

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

+0

с этим запросом я получить тот же результат с второй запрос у меня есть, см. пример в первом примере каждый месяц - count() текущий месяц MORE count() из старых месяцев – angel

+0

см. обновленный ответ –

+0

спасибо, что мне нужно – angel