2016-11-29 73 views
0

我有两个表分组的记录:COUNT(*)按日期横跨两个表

emailLog表:

email   sendTime     sourceTag 
------------------------------------------------------- 
[email protected] 2016-11-17 09:14:37.213 WelcomeEmail 
[email protected] 2016-11-16 09:14:37.213 WelcomeEmail 
[email protected] 2016-11-15 09:12:33.213 WelcomeEmail 

注册表:

email   dateRegistered    regSource 
------------------------------------------------------- 
[email protected] 2016-11-17 09:14:37.213 WelcomeEmail 
[email protected] 2016-11-16 09:14:37.213 WelcomeEmail 
[email protected] 2016-11-15 09:12:33.213 WelcomeEmail 

我试图执行联合查询,以显示在给定日期收到电子邮件的人与COUNT()的COUNT()比较德隆谁已登记在给定日期

我已经尽量得到就象这样:

SELECT 
    CONVERT(varchar(10), sendTime, 120) as date, 
    COUNT(*) as numberSent 
    FROM emailLog 
WHERE sourceTag = 'WelcomeEmail' 
AND 
sendTime BETWEEN '20161110' and '20161120' 
GROUP BY 
    CONVERT(varchar(10), sendTime, 120) 
ORDER BY DATE ASC; 

,给了我一个特定sourceTag发送的电子邮件的列表,通过日期分组:

DATE    NUMBERSENT 
2016-11-17   256 
2016-11-18   136 
2016-11-19   40 
2016-11-20   118 
2016-11-21   186 

但我无法弄清楚如何加入注册的总和与来源,日期+,如:

DATE    NUMBERSENT MEMBERSREGISTERED 
2016-11-17   256   12 
2016-11-18   136   24 
2016-11-19   40   13 
2016-11-20   118   2 
2016-11-21   186   11 

我曾试图做类似...

SELECT 
(SELECT count(*) from emailLog) 
    as emailLogResults, 
(select count(*) from registrations) 
    as registrationResults 
    ... 

但是我被卡住之后。非常感谢的任何帮助

+0

我删除了不兼容的数据库标签。请标记您真正使用的数据库。 –

回答

0

使用这两个表可以使用full join(当两个表中的某个特定日期没有行时,从另一个表中获取行),然后使用条件聚合。

SELECT 
    COALESCE(CONVERT(varchar(10), e.sendTime, 120),CONVERT(varchar(10), r.dateRegistered, 120)) as date, 
    COUNT(e.email) as numberSent, 
    COUNT(r.email) as membersRegistered 
FROM emailLog e 
FULL JOIN registrations r ON e.sendTime = r.dateRegistered 
AND e.sourceTag = 'WelcomeEmail' 
AND r.regSource = 'WelcomeEmail' 
AND e.sendTime BETWEEN '20161110' and '20161120' 
AND r.dateRegistered BETWEEN '20161110' and '20161120' 
GROUP BY COALESCE(CONVERT(varchar(10), e.sendTime, 120),CONVERT(varchar(10), r.dateRegistered, 120)) 
ORDER BY DATE ASC 
+0

我也想到了这一点,但是你将日期记录在'emailLog'上。如果在特定日期没有电子邮件注册,该怎么办? –

+0

@WEI_DBA ..还有一个注册日期过滤器。 –

+0

是的......猜我是在更广泛的意义上思考。 :-) –

1

为了简单明了,我想你可以创建2个临时表。第一个将包含使用特定sourceTag发送的电子邮件列表,按日期分组,如您已经完成的那样。第二个表格将为注册做同样的事情。你可以比内部加入2个临时表。