问题描述
我正在尝试加入两个 ctes 以获得不同国家和组在 id 上的表现差异,这里是我的例子
每个广告系列都可以在不同的国家/地区完成,那么我如何在最后分组以使每个广告系列 ID 有 1 行?
CTE 1:(计划中)
select
country,campaign_id,sum(sales) as planned_sales
from table x
group by 1,2
CTE 2:(实际)
select
country,sum(sales) as actual_sales
from table y
group by 1,2
外部选择
select
country,planned_sales,actual_sales
planned - actual as diff
from cte1
join cte2
on campaign_id = campaign_id
解决方法
应该这样做:
select
cte1.campaign_id,sum(cte1.planned_sales),sum(cte2.actual_sales)
sum(cte1.planned_sales) - sum(cte2.actual_sales) as diff
from cte1
join cte2
on cte1.campaign_id = cte2.campaign_id and cte1.country = cte2.country
group by 1
,
我建议使用 full join
,这样 所有 数据都包含在两个表中,而不仅仅是一个或另一个中的数据。您的查询基本正确,但需要一个 group by
。
select campaign_id,sum(cte1.planned_sales) as planned_sales
sum(cte2.actual_sales) as actual_sales,(coalesce(sum(cte1.planned_sales),0) -
coalesce(sum(cte2.actual_sales),0)
) as diff
from cte1 full join
cte2
using (campaign_id,country)
group by campaign_id;
也就是说,CTE 没有理由应该同时按活动和国家/地区汇总。他们可以仅按广告系列 ID 进行聚合 - 简化查询并提高性能。