SQL - 使用来自两个不同表的日期的条件分组

时间:2017-01-11 11:52:24

标签: sql sql-server group-by

我有两张表AccountHistoryAccessHistoryAccountHistory表包含有关何时激活客户(仅一次)的详细信息。同样,AccessHistory表包含客户登录我们网站时的详细信息(多次)。

AccountHistory:

ID  HistoryDt  CustomerID
--  ---------  ----------
1   2016-01-02          1
2   2016-02-01          2

AccessHistory:

ID  AccessDt  CustomerID
--  ---------  ----------
1   2016-01-02          1
2   2016-02-01          2
3   2016-02-05          2
4   2016-03-06          1

我想编写一个查询来生成一个报告,该报告显示在特定月份登录该网站的客户数量new

例如,从上表中,客户2已于2月启动,并且他已登录两次。客户1也在1月份被激活,并且也在3月份登录。

所以输出将是

 NewUsersAccess      Month
 -------------       -----
             1          1
             2          2
             0          3

由于我是SQL新手,我只能想到使用这样的子查询编写粗略查询:

select COUNT(*) from AccessHistory 
where CustomerID in 
(select DISTINCT(CustomerID) from AccountHistory where HistoryDt > '2015-12-31' 
and HistoryDt < '2016-02-01') and AccessDt > '2015-12-31' 
and AccessDt < '2016-02-01'

但它一次只能获取一个月的数据。有人可以建议一个更好的选择。

1 个答案:

答案 0 :(得分:1)

您正在寻找GROUP BY

select year(ath.historyDt), month(ath.historyDt), count(ath.CustomerId)
from AccountHistory ath left join
     AccessHistory ah
     on ah.CustomerID = ath.CustomerID and
        ah.accessDt >= ath.historyDt and
        ah.accessDt < dateadd(day, 1, eomonth(ath.historyDt))
group by year(ath.historyDt), month(ath.historyDt);

请注意,日期算术使用eomonth()函数来获取该月的最后一个日期 - 然后再为该不等式添加一天。

另外:这仅包括客户实际开始的月份。获得&#34; 0&#34;值是一个稍微不同的问题,会使查询更复杂。