【问题标题】:select total count() group by year and month?按年和月选择总计数()组?
【发布时间】:2013-08-29 05:32:34
【问题描述】:

例如想象如下表格

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

那么如何通过简单的查询获得第一个结果?不是循环

【问题讨论】:

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


    【解决方案1】:

    您需要滚动总计。在 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

    【讨论】:

    • 通过这个查询,我得到与第二个查询相同的结果,请参阅第一个示例中的示例每个月是 count() 当前月份 MORE count() of old months
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多