gpt4 book ai didi

SQL SERVER - 当不匹配条件时获取 0 而不是现在的行

转载 作者:搜寻专家 更新时间:2023-10-30 20:03:54 25 4
gpt4 key购买 nike

首先我会说我不是 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

同时为 count(c.subid) 关闭 ISNULL(count(*), 0) 这样你就不会得到 1c.subidnull 时。

关于SQL SERVER - 当不匹配条件时获取 0 而不是现在的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45825841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com