查询分组依据并从多个列表中排除

时间:2011-10-05 17:56:16

标签: sql tsql

我有一个SQL表(Email_Campaigns),其中包含我们运行的广告系列的主列表:

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(客户)的主列表

问题:如何编写查询以列出每个广告系列,并计算未收到该电子邮件的客户数量?例如('Received'列仅在此处显示以供参考,因为我知道如何计算,因此不是必需的):

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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;

这是最简单的水平。可能需要考虑其他因素,例如在分发广告系列时是否有特定客户处于活动状态。