2016-07-25 16 views
0

私は次のことを得るために、クエリを書いていくつかの問題を抱えていて複数のテーブルを結合地区、地域、地域、郵便番号
表2:MEMBERID 、郵便番号
表3:MEMBERID、電子メールアドレス
表4(電子メールが送信さ):SENDIDは、Countが(一意の電子メールアドレス)を送信
表5(Eメールが開きます):SENDID、カウントは(一意の電子メールアドレス)を開きます
表6(電子メールのクリック数):SendID、クリック数(固有の電子メールアドレス)
SQL Serverが集約

基本的に私は次の出力たい:
地区、地域、地域、SENDIDを、Countはあなたの助けのためのクリック数

おかげカウント、オープンカウント、送信します!

クエリを含むように編集:ここでは

SELECT T1.TERRITORY, T1.DISTRICT, T1.REGION, 
     T4.SENDID, T4.SENDS, T5.BOUNCES, 
     T6.OPENS, T7.CLICKS 
FROM ZIP_TO_TERRITORY AS T1 
INNER JOIN (SELECT UZIPCODE, ID FROM member_UNIVERSE) AS T2 ON T1.ZIPCODE = T2.UZIPCODE 
INNER JOIN (SELECT ID, EMAIL FROM client_EMAILS) AS T3 ON T2. [ID] = T3.ID 
INNER JOIN (SELECT "SENDS" = count(distinct EMAILADDRESS), EMAILADDRESS, SENDID FROM ET_SENT GROUP BY EMAILADDRESS, SENDID) AS T4 ON T3.EMAIL = T4.EMAILADDRESS 
INNER JOIN (SELECT "BOUNCES" = count(distinct EMAILADDRESS),EVENTTYPE,SENDID from ET_BOUNCES GROUP BY EVENTTYPE,SENDID) T5 on T4.SENDID = T5.SENDID 
INNER Join (Select "OPENS" = count(distinct EMAILADDRESS),EVENTTYPE,SENDID FROM ET_OPENS GROUP BY EVENTTYPE,SENDID) T6 on T5.SENDID = T6.SENDID 
INNER Join (SELECT "CLICKS" = count(distinct EMAILADDRESS),EVENTTYPE,SENDID FROM ET_CLICKS GROUP BY EVENTTYPE,SENDID) T7 on T5.SENDID = T7.SENDID 
+2

質問を編集して、これまでのSQLを含めてください。ありがとう! –

+0

申し訳ありませんが、私はちょうど質問を更新しました。 –

答えて

0

は、私はあなたが含まれているコードに基づいて思い付いたものです。直接はそれが適切なように見えたLEFT JOINSはいえ、参加して

SELECT T1.TERRITORY, T1.DISTRICT, T1.REGION, 
     T4.SENDID, 
     COUNT(DISTINCT T4.EMAILADDRESS) AS SENDS, 
     ISNULL(COUNT(DISTINCT T5.EMAILADDRESS),0) AS BOUNCES, 
     ISNULL(COUNT(DISTINCT T6.EMAILADDRESS),0) AS OPENS, 
     ISNULL(COUNT(DISTINCT T7.EMAILADDRESS),0) AS CLICKS 
FROM ZIP_TO_TERRITORY AS T1 
INNER JOIN member_UNIVERSE AS T2 
    ON T1.ZIPCODE = T2.UZIPCODE 
INNER JOIN client_EMAILS AS T3 
    ON T2. [ID] = T3.ID 
INNER JOIN ET_SENT AS T4 -- change this to a LEFT JOIN if you want to see categories that have no (0) ET_SENT records 
    ON T3.EMAIL = T4.EMAILADDRESS 
LEFT JOIN ET_BOUNCES T5 
    ON T4.SENDID = T5.SENDID 
LEFT JOIN ET_OPENS T6 
    ON T5.SENDID = T6.SENDID 
LEFT JOIN ET_CLICKS T7 
    ON T5.SENDID = T7.SENDID 
GROUP BY T1.TERRITORY, T1.DISTRICT, T1.REGION, 
     T4.SENDID; 

は、これはあなたのネストされたクエリを置き換えます。これは、データを集約する場合、かなり標準的なものです。

メッセージの配信試行のIDがSENDIDであると仮定すると、これは関連付けられた地理ベースカテゴリで試行をロールアップし、送信、バウンス、オープン、クリックのカウントを提供します。

これはCOUNT DISTINCTを使用しています。これはコード内にあるためです。それは望ましくないかもしれません。そうでない場合は、コードからDISTINCTを削除してください。 DISTINCTをコードに残しておけば、あなたが望むよりも低い数字が返ってくるかもしれません。SENDIDとメールの間に1対1の関係がある場合は、COUNT DISTINCTは常に1になりますが、削除しますそれをあなたに任せてください。 COUNTCOUNT DISTINCTを混ぜても問題ありません。

一方、SENDIDが実際にキャンペーン(大量メール送信)の識別子である場合は、COUNT DISTINCTが必要なものと正確に一致する可能性があります。 :)

コード内のコメントに記載されているように、送信イベントがゼロのカテゴリ(地域、地域、地区)を表示する場合は、INNER JOINLEFT JOINに変更します。

私はこれのためにデータをモックアップしようとはしませんでしたが、コードはあなたのコードに基づいて作成したモックテーブルでコンパイルして実行しました。

Good Luck!