2011-10-05 59 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)'。 –