如何在无匹配booking记录时返回0计算bookings/clicks(按广告主、日期、名称)
解决方案
要实现你的需求,核心是将原来的inner join改为**左连接(left join)**以保留所有click记录,同时处理无对应booking时的空值问题。修改后的SQL如下:
select c.name, c.advertiser_id, -- 当无对应booking时,将bookings视为0,同时避免除数为0 coalesce(max(b.bookings), 0) / nullif(max(c.clicks), 0) as booking_click_ratio, c.on_date from click c left join booking b on c.advertiser_id = b.advertiser_id and c.name = b.name and c.on_date = b.on_date group by c.name, c.advertiser_id, c.on_date
关键修改说明
- 替换连接类型:把
inner join换成left join,以click表作为主表,这样所有click表的记录都会被保留,即使没有匹配的booking条目。 - 处理空值:使用
coalesce(max(b.bookings), 0),当没有匹配的booking时,max(b.bookings)会返回null,coalesce会将其替换为0,确保比值计算结果为0。 - 避免除数为0报错:添加
nullif(max(c.clicks), 0),如果某个click记录的clicks为0,会将除数转为null,避免出现除以0的错误(如果你的业务中clicks不会为0,这部分可以省略)。 - 统一字段来源:select和group by中的字段都从
click表(别名c)获取,避免因booking无匹配导致字段值为null。
示例验证
用你提供的测试数据执行上述SQL,会得到你期望的结果:
name advertiser_id booking_click_ratio on_date uk 12 1.0000 2018-05-01 us 12 1.0000 2018-05-01 us 12 0.0000 2018-05-02
其中us 2018-05-02这条click记录因为没有对应的booking,计算时bookings被视为0,最终比值为0。
内容的提问来源于stack exchange,提问作者Abhishek Keshri
相关产品推荐
相关产品推荐

