2013-08-26 13 views
5

Per esempio immaginiamo una tabella come di seguitoseleziona il numero totale di conteggi() per anno e mese?

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 

poi nel gennaio 2012 il conteggio era di 10 conti con questa query

select count(*) from account 

Diciamo che ho 5 nuovi conti nel febbraio 2012, quindi l'interrogazione count(*) in Febbraio 2012 restituisce 15 account. Se avessi 10 nuovi account nel marzo 2012, quindi l'interrogazione di count(*) a marzo 2012 restituisce 35 account in totale.

mi piacerebbe ottenere il sotto i risultati

2012-january-10 accounts 
2012-febrary-15 accounts 
2012-march- 35 accounts 

data di creazione in conto tabella è data,

ma se faccio questa domanda

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

ottengo il risultato qui sotto invece:

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

allora come posso ottenere il primo risultato con una semplice query? non loop

risposta

4

Hai bisogno di un totale di rotolamento. Ci sono diverse maniere per farlo in SQL Server (vedi Calculate a Running Total in SQL Server), ma per SQL 2005 più semplice modo (non più veloce) sarebbe auto join

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

con questa query ottengo lo stesso risultato con seconda query che ho, vedere l'esempio nel primo esempio ogni mese è count() current month MORE count() dei vecchi mesi – angel

+0

vedere la risposta aggiornata –

+0

grazie di cui avevo bisogno – angel