SQL Server使用聚合连接多个表

时间:2016-07-25 23:40:19

标签: sql sql-server tsql

我在编写查询时遇到了一些问题,以获得以下内容:

表1(邮编到地区):地区,地区,地区,邮政编码
表2:会员ID,邮政编码
表3:MemberID,电子邮件地址
表4(电子邮件发送):SendID,Count发送(唯一的电子邮件地址)
表5(电子邮件打开):SendID,计数打开(唯一的电子邮件地址)
表6(电子邮件点击):SendID,计算点击次数(唯一的电子邮件地址)

基本上我想要以下输出:
区,地区,地区,SENDID,计数发送,计数打开,计数点击

感谢您的帮助!

编辑以包含查询:

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

1 个答案:

答案 0 :(得分:0)

根据您所包含的代码,我提出了以下内容。

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;

这会使用直接连接替换嵌套查询,尽管LEFT JOINS似乎是合适的。在汇总数据方面,这是非常标准的东西。

假设SENDID是邮件传递尝试的ID,这将使用其关联的地理基础类别汇总尝试,并为您提供发送,退回,打开和点击的计数。

这使用COUNT DISTINCT,因为这是您的代码中的内容。这可能并不可取。如果没有,请从代码中删除DISTINCT s。将DISTINCT留在代码中可能会为您提供低于您想要的数字,或者如果SENDID与电子邮件之间存在一对一的关系,COUNT DISTINCT将会永远是1.我会删除它们,但我会把它留给你。您可以混合COUNTCOUNT DISTINCT,这没关系。

另一方面,如果SENDID确实是广告系列(群发邮件)标识符,则COUNT DISTINCT可能正是您所需要的。 :)

如代码中的评论所述,如果您希望查看发送事件为零的类别(地区,区域和区域),请将其中一个INNER JOIN更改为LEFT JOIN

我没有尝试为此模拟任何数据,但代码编译并使用我根据您的代码创建的模拟表运行。

祝你好运!

相关问题