Sql 计算每年的客户数量(新客户和返回客户)

Sql 计算每年的客户数量(新客户和返回客户),sql,sql-server,sql-server-2008,count,sum,Sql,Sql Server,Sql Server 2008,Count,Sum,各位, 我试图形成一个查询,显示特定年份的客户数量。clients表包含一个字段client_-since、all-clients-info、active_-client、date_-deleted,当客户端取消订阅通信时用作标志 每一张唱片的客户名单都显示了他们成为客户的那一年。 当我按年查询时,我会得到新客户的记录,但是,我正在尝试形成查询,以显示新客户和返回客户的数量。为了争论,所有的客户都回来了 假设我2008年有1个客户,2009年有6个客户,2010年有6个客户,2011年有10个客

各位,

我试图形成一个查询,显示特定年份的客户数量。clients表包含一个字段client_-since、all-clients-info、active_-client、date_-deleted,当客户端取消订阅通信时用作标志

每一张唱片的客户名单都显示了他们成为客户的那一年。 当我按年查询时,我会得到新客户的记录,但是,我正在尝试形成查询,以显示新客户和返回客户的数量。为了争论,所有的客户都回来了

假设我2008年有1个客户,2009年有6个客户,2010年有6个客户,2011年有10个客户,依此类推。我需要这个查询按年度汇总所有客户

我得到的结果是:

select count (id) as [New Clients],client_since
from tax_clients 
where client_since >= 2008
group by client_since
结果是:

new clients
1   2009
8   2010
6   2011
6   2012
11  2013
6   2014
9   2015
17  2016
20  2017
13  2018
26  2019
41  2020
7   2021
因此,计算将添加所有新客户机

谁能告诉我如何构造查询

谢谢

我正在尝试形成查询,以显示新客户和返回客户的数量。为了争论,所有的客户都回来了

返回的客户端逻辑看起来是一个窗口和:

select 
    client_since, 
    count(*) as new_clients, 
    sum(count(*)) over(order by client_since) returning_clients
from tax_clients 
where client_since >= 2008
group by client_since
order by client_since
可能非常旧版本的SQL Server更喜欢子查询,而不是在同一范围内混合使用聚合和窗口函数:

select t.*, 
    sum(new_clients) over(order by client_since) returning_clients
from (
    select client_since, count(*) as new_clients
    from tax_clients 
    where client_since >= 2008
    group by client_since
) t
order by client_since

假设客户处于活动状态时,您每年有一条记录,则可以使用lag:


请定义新建和返回?如果客户跳过几年怎么办?示例数据和期望的结果会有所帮助。新客户机是第一个使用该服务的客户机,returning是一个每年都返回的客户机。如果一个客户端跳过一年,它将被禁用,当它返回时,它将被视为一个新的客户端。你为什么要使用不受支持的软件?这就是我所拥有的。我不做很多数据库的东西,只是基本的。总有一天我会升级,但今天,这就是我的工作…谢谢。我得到消息102,级别15,状态1,第4行“订单”附近的语法不正确。我没有提到这是sql 2008…用…替换超额订单。。。由于。。。给出与原始查询2009 1 1 2010 8 8 2011 6 6 2012 6 6 2013 11 2014 6 2015 9 9 2016 17 2017 20 20 2018 13 13 2019 26 2020 41 2021 7相同的结果7@Antonio:你需要提前订货。分区方式不起同样的作用。我用一个可能在旧版本(如youers)上工作得更好的替代方案更新了我的答案。lag不是公认的内置函数,我仍然在上一次查询Msg 102,15级,状态1,第2行“order”附近出现语法错误。GMB,此查询在第2行select t.*上的order附近仍然出现语法错误,sumnew_客户自返回所选客户自以来的超额订单,将*视为来自税务客户t的新客户,其中客户自>=2008年集团自客户自自自客户自订单以来Gordon sinceHi。Lag对sql 2008无效…不是有效的内置函数。
select client_since, count(*) as num_active_clients,
       sum(case when prev_cs = client_since - 1 then 1 else 0 end) as num_new_clients
from (select t.*,
             lag(client_since) over (partition by id order by client_since) as prev_cs
      from tax_clients t
     ) t
group by client_since