出于这个问题的目的,我有 2 张桌子。
- 请求:时间戳、SessionID、Site、CampaignID、TagName
- 事件:时间戳、SessionID、CampaignID、TagName、InteractionID
大多数字段都是 varchar 并允许空值,因为这些是从自定义服务器日志导入的平面文件,有时意外字符可能会从另一个字段泄漏到一个字段中 - 我无法控制。我的要求是提供一份网站报告,详细说明唯一网站、广告标签和每个广告(标签)在每个网站上运行的次数,以及用户与广告的互动次数,以及点击次数,这是定义的作为 3 个交互 ID(1、2 或 3)之一。
运行一个单独的查询来检查 Requests 中的实际数据:
SELECT Convert(CHAR(10), r.Timestamp,101) AS [Date]
, r.Site, r.CampaignID
, r.TagName, Count(r.TagName) AS TagCount
FROM Requests AS r
WHERE r.CampaignID = 1901
GROUP BY CONVERT(CHAR(10), r.Timestamp,101) , r.Site, r.CampaignID, r.TagName
ORDER BY [Date], r.Site, r.CampaignID, r.TagName
产量:
Date Site CampaignID TagName TagCount
09/01/2013 Site1 1901 Tag1 61
09/01/2013 Site1 1901 Tag2 3703
09/01/2013 Site1 1901 Tag3 279
09/01/2013 Site2 1901 Tag1 30
...
为了计算我尝试过的交互次数......
SELECT CONVERT(CHAR(10), r.Timestamp,101) AS [Date], r.Site, r.CampaignID, r.TagName, Count(r.TagName) As TagCount, Count(e.InteractionID) AS InteractionCount
FROM Requests AS r
LEFT JOIN Events as e ON r.SessionID = e.SessionID
WHERE r.CampaignID = 9101
GROUP BY CONVERT(CHAR(10), r.Timestamp,101) ,r.Site, r.CampaignID, r.TagName
ORDER BY [Date], r.Site, r.CampaignID, e.TagName
产量:
Date Site CampaignID TagName TagCount InteractionCount
09/01/2013 Site1 9101 Tag1 130 78
09/01/2013 Site1 9101 Tag2 3805 352
09/01/2013 Site1 9101 Tag3 307 53
09/01/2013 Site2 9101 Tag1 30 0
...
我的问题/问题。TagCount 上升了,这让我很吃惊。我可以理解由于加入条件它会如何下降,但为什么会上升?在我看来,第一个查询应该计算所有可用记录,第二个查询不应该找到更多要计算的记录。这一定是我不了解左连接的东西。那么如何从 Requests 中获取 TagCount,以便它只计算所有这些,然后从每个站点和 TagName 的事件中获取 InteractionCount。我对 SQL 不够熟悉,无法提出一个可以实现正确结果的子查询,但我想这就是答案所在。
我的问题的最后一部分是点击
Where e.InteractionID = '1' OR e.InteractionID = '2' OR e.InteractionID = '3'
将我的结果集限制为仅包含点击的那些记录,但我需要左侧的其余记录,如果没有点击,则为 0,以及满足这些条件的任何记录的总和。
我希望我已经清楚了这些问题,感谢您的时间和精力,在此先感谢。