【问题标题】:count(*) records grouped by date across two tablescount(*) 记录在两个表中按日期分组
【发布时间】:2017-04-13 19:01:03
【问题描述】:

我有两张桌子:

emailLog 表:

email           sendTime                   sourceTag
-------------------------------------------------------
yadda@aol.com   2016-11-17 09:14:37.213    WelcomeEmail
badda@aol.com   2016-11-16 09:14:37.213    WelcomeEmail
test@aol.com    2016-11-15 09:12:33.213    WelcomeEmail

注册表表:

email           dateRegistered             regSource
-------------------------------------------------------
yadda@aol.com   2016-11-17 09:14:37.213    WelcomeEmail
badda@aol.com   2016-11-16 09:14:37.213    WelcomeEmail
test@aol.com    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
    ...

但在那之后我被困住了。非常感谢任何帮助

【问题讨论】:

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

标签: sql sql-server-2008 join union


【解决方案1】:

您可以对这两个表使用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

【讨论】:

  • 我也想到了这个,但你的日期是基于emailLog。如果在特定日期有注册但没有电子邮件怎么办?
  • @WEI_DBA .. 还有一个用于注册的日期过滤器。
  • 是的......我想我是在更广泛的意义上思考。 :-)
【解决方案2】:

为了让事情简单明了,我认为,您可以创建 2 个临时表。第一个将包含使用特定 sourceTag 发送的电子邮件列表,按日期分组,就像您已经做的那样。第二个表将为注册做同样的事情。您可以比内连接 2 个临时表。

【讨论】:

    猜你喜欢
    • 2014-01-31
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    相关资源
    最近更新 更多