2013-08-26 107 views
5

Ví dụ tưởng tượng một bảng như sauchọn tổng số() nhóm theo năm và tháng?

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 

sau đó trong tháng 1 năm 2012 số lượng là 10 tài khoản với truy vấn này

select count(*) from account 

Hãy nói rằng tôi có 5 tài khoản mới trong tháng Hai năm 2012, sau đó truy vấn count(*) trong Tháng 2 năm 2012 trả về 15 tài khoản. Nếu tôi có 10 tài khoản mới vào tháng 3 năm 2012 thì khi đó, truy vấn count(*) vào tháng 3 năm 2012 sẽ trả về 35 tài khoản.

Tôi muốn để có được những kết quả dưới đây

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

ngày tạo trong tài khoản của bảng là ngày,

nhưng nếu tôi làm truy vấn này

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

tôi nhận được kết quả dưới đây thay vào đó:

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

sau đó làm thế nào tôi có thể nhận được kết quả đầu tiên với một truy vấn đơn giản? không loops

Trả lời

4

Bạn cần tổng số cán. Như vậy là một vài cách để làm điều đó trong SQL Server (xem Calculate a Running Total in SQL Server), nhưng đối với SQL 2005 đơn giản nhất (không nhanh nhất) cách sẽ tự tham gia

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

với truy vấn này tôi nhận được kết quả tương tự với truy vấn thứ hai tôi có, xem ví dụ trong ví dụ đầu tiên mỗi tháng được tính() tháng hiện tại Đếm nhiều hơn() của tháng cũ – angel

+0

xem câu trả lời cập nhật –

+0

cảm ơn rằng tôi cần – angel