在一条记录上连接表,但根据连接中的其他行计算字段

时间:2013-08-27 18:36:02

标签: sql join

我正在尝试编写一个查询来识别在最后一天放弃购物车的订阅者,但我还需要一个计算字段来表示他们在过去7天内收到的天气和奖励。

我有以下表格

AbandonCart_Subscribers Sendlog

查询的第一部分很简单,在最后一天得到放弃

select a.* from AbandonCart_Subscribers 
where DATEDIFF(day,a.DateAbandoned,GETDATE()) <= 1 

这是我尝试计算奖励但我相当肯定它是不正确的,因为IncentiveRecieved总是0,即使我知道它不应该是......

select a.*, 
CASE 
  WHEN DATEDIFF(D,s.SENDDATE,GETDATE()) >= 7 
    THEN 1
    ELSE 0
  END As IncentiveRecieved
from AbandonCart_Subscribers a 
left join SendLog s on a.EmailAddress = s.EmailAddress and s.CampaignID IS NULL  
where
DATEDIFF(day,a.DateAbandoned,GETDATE()) <= 1 

这是一个关于对象和一些数据的SQL小提琴。我真的很感激一些帮助。

由于

http://sqlfiddle.com/#!3/f481f/1

3 个答案:

答案 0 :(得分:0)

您可以使用条件设置变量:

select a.*,(DATEDIFF(D,s.SENDDATE,GETDATE()) >= 7) as `IncentiveRecieved `
    from AbandonCart_Subscribers a 
    left join SendLog s on a.EmailAddress = s.EmailAddress and s.CampaignID IS NULL  
    where
    DATEDIFF(day,a.DateAbandoned,GETDATE()) <= 1 

这是你要找的吗?

答案 1 :(得分:0)

是不是应该小于7而不是大于7?

选择一个。*, 案件   WHATED DATEDIFF(D,s.SENDDATE,GETDATE())&lt; = 7 AND CampaignID不为null     然后1     ELSE 0   结束作为奖励获得 来自AbandonCart_Subscribers a 左连接SendLog s on a.EmailAddress = s.EmailAddress - and s.CampaignID IS NULL 哪里 DATEDIFF(day,a.DateAbandoned,GETDATE())&lt; = 1

希望这能满足您的需求。

答案 2 :(得分:0)

Kishore说的主要问题是它应该是&lt; = 7,而不是&gt; = 7。但是,还有另一个问题。

目前,您可以获得多个结果。如果同一个电子邮件地址不止一次,您不希望在SendLog上进行左连接。相反,您应该从该表中获得唯一的结果。有几种方法可以做到这一点;这是一种使用派生表的方法。我打电话给的表格将为您提供上周发送奖励的电子邮件的唯一列表。

select a.*, 
CASE 
  WHEN s.EmailAddress is not null
    THEN 1
    ELSE 0
  END As IncentiveRecieved
from AbandonCart_Subscribers a 
left join (select distinct EmailAddress
           from SendLog s 
           where s.CampaignID IS NULL
           and DATEDIFF(D,s.SENDDATE,GETDATE()) <= 7 
          ) s on a.EmailAddress = s.EmailAddress 
where DATEDIFF(day,a.DateAbandoned,GETDATE()) <= 1