Sql 查询以获取印象和相关点击次数

Sql 查询以获取印象和相关点击次数,sql,sql-server,Sql,Sql Server,我似乎无法让这个查询给出正确的结果 select datepart(day, i.timestamp) as [day], i.campaignID, i.creativeID , count(distinct i.sessionID) as [Impressions] , count(case when e.eventID in (1,2,3) then 1 else 0 end) as Clicks from impressions i left jo

我似乎无法让这个查询给出正确的结果

select 
    datepart(day, i.timestamp) as [day], 
    i.campaignID, i.creativeID
    , count(distinct i.sessionID) as [Impressions]
    , count(case when e.eventID in (1,2,3) then 1 else 0 end) as Clicks

from impressions i 
left join Events e 
    on i.sessionID = e.sessionID

group by 
    datepart(day, i.timestamp)
    , i.campaignID, i.creative

order by [day]
我还尝试在then子句中用e.eventid替换1。我在结果中得到了太多的点击。Events每个sessionid有多条记录,因为在同一个会话中可以发生多种类型的事件(滚动、卷展等)。我要计算的事件的eventid为1、2或3,因为这是您可以单击的3个可能的链接。我要找的是通过获得印象和相关点击数来计算点击率,如果没有点击,我希望它反映为0,而不是从结果中丢失,这就是我得到的


感谢您的帮助,提前感谢您宝贵的时间

尝试将第二个
计数
替换为
总和
,如下所示:

select 
  datepart(day, i.timestamp) as [day], 
  i.campaignID, i.creativeID
  , count(distinct i.sessionID) as [Impressions]
  , sum(case when e.eventID in (1,2,3) then 1 else 0 end) as Clicks

from impressions i 
left join Events e 
  on i.sessionID = e.sessionID

group by 
  datepart(day, i.timestamp)
  , i.campaignID, i.creative

order by [day]
或者,您可以保持
count
,并将
eventID
筛选移动到
where
子句:

select 
  datepart(day, i.timestamp) as [day], 
  i.campaignID, i.creativeID
  , count(distinct i.sessionID) as [Impressions]
  , count(e.eventID) as Clicks

from impressions i 
left join Events e 
  on i.sessionID = e.sessionID

where e.eventID in (1,2,3)

group by 
  datepart(day, i.timestamp)
  , i.campaignID, i.creative

order by [day]

但是我怀疑您需要在
on
子句中添加额外的过滤条件。但是,我不知道您的表的结构是否确定。

这看起来更有可能,谢谢!你能解释一下为什么总和(1)给出的结果与计数(1)不同吗?当然
count
包括0/1系列的每个元素,无论是0还是1(
count{0,1,1,0,0,1}
=7)<代码>求和只加1,而0没有差别(
求和{0,1,1,0,0,1}
=0+1+1+0+0+1=4)。但所有这些都适用于集合。sum(1)与count(1)没有区别,因为第一个加起来是1,第二个有1个元素。明白了谢谢,我很惊讶count包含了零-case结构告诉我,如果没有。。。啊,好吧,我突然明白了。脸掌-whutta idjut:P