2013-08-27 22 views
1

我正在嘗試編寫一個查詢來識別已在最後一天放棄購物車的訂閱者,同時我還需要一個計算字段來表示天氣或沒有他們在過去的7天內收到過獎勵。在一條記錄上加入表格,但根據加入中的其他行計算字段

我有以下表

AbandonCart_Subscribers Sendlog

查詢的第一部分是容易的,得放棄在最後一天

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

這是我嘗試計算獎勵但我相當肯定這是不正確的,因爲激勵Recieved始終爲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

回答

0

Kishore說得對,主要問題是它應該是< = 7,而不是> = 7。但是,還有另一個問題。

就目前而言,您可能會得到多個結果。如果同一電子郵件地址不止一次,您不想在SendLog上進行左連接。相反,您應該從該表中獲得唯一結果。有幾種方法可以做到這一點;這是使用派生表的一種方式。我稱之爲s的表格將爲您提供一份獨特的電子郵件列表,這些電子郵件在上週已經被髮送。

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 
+0

我終於弄明白了,我的解決方案几乎就是您提供的。我很感激幫助。 – user1735894

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 

這是你在找什麼?

0

它是否應該小於7而不是大於7?

選擇。*, CASE WHEN DATEDIFF(d,s.SENDDATE,GETDATE())< = 7的CampaignID不爲空 THEN 1 ELSE 0 END作爲IncentiveRecieved 從AbandonCart_Subscribers一個 左連接SendLog S於a.EmailAddress = s.EmailAddress --and s.CampaignID IS NULL 其中 DATEDIFF(日,a.DateAbandoned,GETDATE())< = 1

希望這會滿足您的需要。

+0

是的,我已經計算出查詢,你是正確的。它本來應該大於。 – user1735894

相關問題