首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL SERVER -不匹配条件时,获取0而不是now行

SQL SERVER -不匹配条件时,获取0而不是now行
EN

Stack Overflow用户
提问于 2017-08-23 03:47:30
回答 1查看 51关注 0票数 2

我首先要说的是,我不是SQL专家,更不用说SQL服务器了。

我正在尝试执行下面的查询:

基本上,它的作用是,对于开始日期和结束日期之间的每一天,获取一些数据并将其插入到表变量中。

代码语言:javascript
复制
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

我想要实现的东西是这样的:

代码语言:javascript
复制
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        

但我得到的是:

代码语言:javascript
复制
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.idC.tstamp >= ...C.tstamp <= ...,这意味着没有符合这个条件的行。

但是我也需要得到那0行!

请帮帮我。

提前感谢并祝您编程愉快!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-23 03:49:51

使用left join是正确的,但是当前的where子句阻止了空行的计数。将条件移动到联接条件,如下所示:

代码语言:javascript
复制
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

另外,为count(c.subid)去掉ISNULL(count(*), 0),这样当c.subidnull时,您就不会得到1的计数。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45825841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档