我有一个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
答案 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;
这是最简单的水平。可能需要考虑其他因素,例如在分发广告系列时是否有特定客户处于活动状态。