我想在Big Query中使用完整的外部联接来组合下面的两个表。表A没有我需要从表B带来的某些产品,但当我加入活动&subcompagn,我的加入没有带来'CellPhone'
数据。我的结果看起来更像是左联接。请参阅下面的查询
SELECT
a.campaign
, a.subcampaign
, a.product
, sum(sales)
, sum(cost)
FROM
(
SELECT
campaign
, subcampaign
, product
, sum(sales)
FROM
table_a
GROUP BY
1, 2, 3
) a
FULL OUTER JOIN
(
SELECT
campaign
, subcampaign
, product
, sum(cost)
FROM
table_b
GROUP BY 1,2,3
) b
ON
a.campaign = b.campaign
AND a.subcampaign = b.subcampaign
GROUP BY
1,2,3
表a
活动 | 子活动 | 产品销售||
---|---|---|---|
活动1 | Store 581 | 游戏 | $50 |
活动1 | Store 583 | 电视<100美元>
我认为问题可能是您的select
子句,而不是join
。
我怀疑混淆之处在于,即使在联接与table_a
中的任何内容都不匹配的情况下,您也选择了a.campaign
(等等(。如果table_a
中没有匹配项,则a.campaign
/a.subcampaign
/a.product
将全部为空。
您可能希望在外部查询中使用类似以下内容的内容:
SELECT
COALESCE(a.campaign, b.campaign)
, COALESCE(a.subcampaign, b.subcampaign)
, COALESCE(a.product, b.product)
, sum(sales)
, sum(cost)
[...]
GROUP BY
COALESCE(a.campaign, b.campaign)
, COALESCE(a.subcampaign, b.subcampaign)
, COALESCE(a.product, b.product)
这样,如果a.campaign
(等等(为空,它将回退到b.campaign
。这是安全的,因为我们知道,如果两者都有值,那么它们必须相等。
在连接两个表之前进行聚合,这就是为什么在结果中可能不会得到任何null值。尝试从联接中选择所有值,然后聚合以获得您想要的结果,如下所示:
SELECT
ab.campaign, ab.subcampaign, ab.product, SUM(sales), SUM(cost)
FROM (
SELECT *
FROM
table_a
FULL OUTER JOIN
table_b
ON
a.campaign = b.campaign
AND a.subcampaign = b.subcampaign ) ab
GROUP BY
1,2,3