2017-08-22 6 views
2

SQLのエキスパートではなく、SQL Serverの方がはるかに少ないと言って始めます。SQL SERVER - 条件に合致しないときに現在行ではなく0を取得

私は、クエリ怒鳴るを実行しようとしている:

基本的にそれが何をするか、開始日と終了日 私にいくつかのデータを取得し、テーブル変数に挿入の間に毎日のために、です。何イム達成しようとし

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.idC.tstamp >= ...C.tstamp <= ...をこの基準に一致する行はありません。

でも、私はその0行も取得する必要があります!

お願いします。

ありがとうございました!

答えて

5

あなたは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 

c.subidnullあるときに、あなたが1のカウントを取得していないcount(c.subid)ためISNULL(count(*), 0)を切り替えます。

+0

ありがとう@SqlZim、それは私の問題を修正しました。 –

+0

@MiguelPinto助けて嬉しいです! – SqlZim

関連する問題