2011-10-05 64 views
1

我有一个SQL表(Email_Campaigns)与活动的主列表,我们已经运行:查询到GROUP BY和从多个列表中排除

Name   DateSent 
Campaign01 01/01/2011 
Campaign02 01/15/2011 
.. 
Campaign40 10/01/2011 

我有一个客户列表(Email_Received )与他们的会员号码,他们已经收到了活动:

PK MembershipNo CampaignName 
1   123456  Campaign01 
2   123456  Campaign02 
3   987654  Campaign05 
4   111111  Campaign10 

我也得到了客户的MembershipNo的主列表(客户)

问题:如何编写查询来列出每个广告系列并计算未收到该电子邮件的客户数量?例如(“收到”列在这里仅作参考,而不是必要的,因为我知道如何计算):

Name   Received DidNotReceive 
Campaign01  1000    9000 
Campaign02  3000    7000 
.. 
Campaign40   100    9900 
+0

要解决下面的问题......是的,肯定有客户收到多个电子邮件的情况,这是有目的的。 – hurleystylee

回答

1

这里有一个标准SQL的方式来写:

SELECT ec.Name, count(c.MembershipNo) AS DidNotReceive 
    FROM Customers AS c 
    , Email_Campaigns AS ec 
WHERE NOT EXISTS (
    SELECT 1 
     FROM Email_Received AS r 
    WHERE er.CampaignName = ec.CampaignName 
     AND er.MembershipNo = c.MembershipNo) 
GROUP BY ec.Name 
ORDER BY ec.Name; 
+0

谢谢!我很高兴我问过,因为我之前有过除了“AND”条款之外的所有内容......难怪查询旋转了15分钟以上,没有结果。 : -/ – hurleystylee

+0

@hurleystylee:如果你的具体条件允许的话,你也应该尝试一下乔·斯特法内利的答案,这个答案在大桌子上可能会快得多。加入'DISTINCT'我提到,如果需要的话。 –

0
SELECT er.CampaignName, 
     COUNT(*) AS Received, 
     (SELECT COUNT(*) FROM Customers) - COUNT(*) AS DidNotReceive 
    FROM Email_Received er 
    GROUP BY er.CampaignName 
    ORDER BY er.CampaignName; 

这是最简单的级别。可能还需要考虑其他因素,例如在活动分发时是否有某个特定客户处于活动状态。

+0

这应该比我的回答更快。然而,我的答案还包括'Email_Received'中的重复条目(人们可能会通过设计或错误获取多封电子邮件) - 这个问题没有被排除。可以使用COUNT(DISTINCT x)修复。不确定在tsql中是否允许。 –

+0

@ErwinBrandstetter T-SQL有'COUNT(DISTINCT x)'。 –