SQL SERVER-当不符合条件时,获取0而不是立即获取行

SQL SERVER-当不符合条件时,获取0而不是立即获取行,sql,sql-server,database,Sql,Sql Server,Database,我首先要说的是,我不是SQL方面的专家,更不用说SQL SERVER了 我正在尝试执行以下查询: 基本上,它所做的是,在开始日期和结束日期之间的每一天 获取一些数据并将其插入表变量中 BEGIN declare @sdate datetime = dateadd(day, -10, getdate()) declare @edate datetime = getdate() declare @max int = datediff(day, @sdate, @edate) declare @sd

我首先要说的是,我不是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-2     |  2017-08-01 | 1   
---------------------------------------
send-2     |  2017-08-02 | 4  

<> P>我知道这是因为这个-> <代码> C.Suid=C.I.<代码>,<代码> C.TAMP>=…和<代码> C.tstamp > P>你使用了你的<代码>左连接< /代码>,但是你的当前<代码>其中子句阻止了空白行被计数。将条件移动到联接条件,如下所示:

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
选择CS.send\u id,@ssdate作为[date],count(c.subid)作为day\u转换
从《历史》杂志
左侧外部联接活动\u在CS.campaign\u historyID=CH.id上发送CS
c.subid=convert(varchar(255),CS.id)上的左外连接c
和isnumeric(C.subid)0
和C.tstamp>@ssdate
和C.tstamp<@eedate
左外连接转换\u keygen CK ON CK.activitid=CS.id
并强制转换(CK.genkey为varchar(255))=C.clickid
左外连接导线\u左上左下馈电导线ID=CK.leadID
哪里
CH.id=19
按CS.send\u id分组

另外,请将
ISNULL(count(*),0)
切换为
count(c.subid)
以便在
c.subid
null

时不会得到
1
的计数。谢谢@SqlZim,它解决了我的问题。@MiguelPinto很乐意帮忙!
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