我有两张表AccountHistory
和AccessHistory
。 AccountHistory
表包含有关何时激活客户(仅一次)的详细信息。同样,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'
但它一次只能获取一个月的数据。有人可以建议一个更好的选择。
答案 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;值是一个稍微不同的问题,会使查询更复杂。