我首先要说的是,我不是SQL专家,更不用说SQL SERVER了。
我正在尝试执行下面的查询:
基本上,它的作用是,对于开始日期和结束日期之间的每一天 给我一些数据并将其插入表变量中。
BEGIN
declare @sdate datetime = dateadd(day, -10, getdate())
declare @edate datetime = getdate()
declare @max int = datediff(day, @sdate, @edate)
declare @sday int = cast(day(@sdate) as int)
declare @i int = 1;
declare @Days2 table (
[sending_id] varchar(255) not null,
[day] datetime not null,
[conversions] int not null
)
while @i <= @max
BEGIN
declare @ssdate datetime = cast(dateadd(day, (@max - @i) * -1 , @edate) as date)
declare @eedate datetime = cast(dateadd(day, ((@max - @i) * -1) + 1 , @edate)as date)
INSERT into @Days2 ([sending_id], [day], [conversions])
select CS.send_id, @ssdate as [date], ISNULL(count(*), 0) as day_conversion
from campaigns_history CH
LEFT OUTER JOIN campaign_sends CS ON CS.campaign_historyID = CH.id
LEFT OUTER JOIN c C ON C.subid = convert(varchar(255), CS.id)
LEFT OUTER JOIN conversions_keygen CK ON CK.campaignID = CS.id AND cast(CK.genkey as varchar(255)) = C.clickid
LEFT OUTER JOIN lead_feed LF ON LF.leadID = CK.leadID
WHERE
CH.id = 19
and isnumeric(C.subid) <> 0
and C.tstamp > @ssdate
and C.tstamp < @eedate
group by CS.send_id
SET @i = @i+1
END
select * from @Days2
END
我试图实现的是这样的:
sending_id | days | conversions
---------------------------------------
send-1 | 2017-08-01 | 1
---------------------------------------
send-1 | 2017-08-02 | 0 -- the problem is here
---------------------------------------
send-2 | 2017-08-01 | 1
---------------------------------------
send-2 | 2017-08-02 | 4
但我明白这个:
sending_id | days | conversions
---------------------------------------
send-1 | 2017-08-01 | 1
---------------------------------------
send-2 | 2017-08-01 | 1
---------------------------------------
send-2 | 2017-08-02 | 4
我知道发生这种情况是因为这个 ->C.subid = CS.id
、C.tstamp >= ...
和C.tstamp <= ...
意味着没有符合此条件的行。
但是我也需要得到那 0 行!
请帮帮我。
提前感谢,祝您编程愉快!
您使用left join
走在正确的轨道上,但您当前的where
子句阻止了空白行的计数。将条件移动到联接条件,如下所示:
select CS.send_id, @ssdate as [date], count(c.subid) as day_conversion
from campaigns_history CH
LEFT OUTER JOIN campaign_sends CS ON CS.campaign_historyID = CH.id
LEFT OUTER JOIN c C ON C.subid = convert(varchar(255), CS.id)
and isnumeric(C.subid) <> 0
and C.tstamp > @ssdate
and C.tstamp < @eedate
LEFT OUTER JOIN conversions_keygen CK ON CK.campaignID = CS.id
AND cast(CK.genkey as varchar(255)) = C.clickid
LEFT OUTER JOIN lead_feed LF ON LF.leadID = CK.leadID
WHERE
CH.id = 19
group by CS.send_id
还要将ISNULL(count(*), 0)
换成count(c.subid)
,这样当c.subid
null
时,您就不会获得1
计数。