SQL Big Query 完全连接表以使用相同的过滤器

Posted

技术标签:

【中文标题】SQL Big Query 完全连接表以使用相同的过滤器【英文标题】:SQL Big Query Full join tables in order to use same filter 【发布时间】:2020-05-15 08:46:34 【问题描述】:

我在 Google Big Query 中有两个表,我想加入它们以便过滤(使用一个过滤器)仪表板中的数据。

表一包含日期、国家和收入。表二包含日期、国家和成本。 我希望能够过滤日期和国家并​​显示收入和成本。但是,有些日子/国家/地区没有收入但有成本,有些日子/国家没有成本但有收入。

我首先使用左连接连接表格,这导致表格不完整,缺少某些国家/地区没有收入的日期的成本。现在我尝试通过使用这样的完整连接来解决这个问题:

FULL JOIN (SELECT
date,
shipping_country AS shipping_country_spend,
sum(spend) AS Spend
FROM spend_total Group by 1,2) oo
ON oo.date = o.Date
WHERE shipping_country_spend IS NULL OR shipping_country_spend = shipping_country

但是,对于没有收入的日期/国家/地区组合,我仍然没有计算成本。

其次,对于成本,我有一个名为“其他”的剩余列 - 这显然不是一个国家/地区。我希望它作为单独的一行出现,国家为“其他”,收入 = 0。

重要的是,我可以使用“日期”和“国家”作为过滤器。期望的结果是这样的:

Date : Country : Revenue : Cost
15-05-2020 : Spain : 3000 : 200
15-05-2020 : Belgium : 0 : 300
15-05-2020 : Other : 0 : 500
15-05-2020 : Netherlands : 2000 : 0

非常感谢!

【问题讨论】:

你能分享完整的查询吗? 【参考方案1】:

USING 子句解决了您的问题。这看起来像:

select date, country, r.revenue, s.spend
from (select date, revenue_country as country, sum(revenue) as revenue
      from revenue
      group by date, revenue_country
     ) r full join
     (select date, shipping_country as country, sum(spend) as spend
      from spend_total
      group by date, shipping_country
     ) s
     using (date, country)
where date = ? and country = ?;

以下对于这种方法很重要:

datecountry 需要在两个查询中具有相同的名称。 需要using 子句。由于该子句,此处更简单的语法有效。 在selectwhere 中没有使用表别名来限定datecountry

您也可以使用on 子句来表达这一点,但要复杂得多:

select coalesce(s.date, r.date) as date, 
       coalesce(r.county, s.country) as country,
       r.revenue, s.spend
from (select date, revenue_country as country, sum(revenue) as revenue
      from revenue
      group by date, revenue_country
     ) r full join
     (select date, shipping_country as country, sum(spend) as spend
      from spend_total
      group by date, shipping_country
     ) s
     using s.date = r.date and r.county = s.country
where coalesce(s.date, r.date) = ? and
      coalesce(r.county, s.country) = ?;

【讨论】:

嗨,戈登,感谢您的回复。我尝试了这两种解决方案,但不幸的是我收到错误消息“不支持位置参数”。我正在使用谷歌大查询。你对此有什么想法吗?谢谢! ? 适用于您想要的任何过滤器。它们旨在暗示过滤,这是您问题的一部分。您将输入适合过滤的任何内容(它与答案的其余部分并不真正相关)。【参考方案2】:

你能看看这是不是你想要的吗?

CREATE TEMP TABLE t1
AS SELECT DATE '2020-1-1' Date, 'US' Country, 100 Revenues
  UNION ALL 
   SELECT DATE '2020-1-2' Date, 'MX' Country, 100 Revenues;

CREATE TEMP TABLE t2
AS SELECT DATE '2020-1-1' Date, 'US' Country, 200 Costs
  UNION ALL 
   SELECT DATE '2020-2-2' Date, 'MX' Country, 200 Costs;

SELECT COALESCE(t1.Date, t2.Date) Date,  COALESCE(t1.Country, t2.Country) Country, Revenues, Costs
FROM t1 FULL OUTER JOIN t2 USING (Date, Country);

输出:

+------------+---------+----------+-------+
|    Date    | Country | Revenues | Costs |
+------------+---------+----------+-------+
| 2020-02-02 | MX      |     NULL |   200 |
| 2020-01-01 | US      |      100 |   200 |
| 2020-01-02 | MX      |      100 |  NULL |
+------------+---------+----------+-------+

【讨论】:

您好,云,感谢您的回复。我是否将查询中的“from t2”更改为“spend_total”(我的表)?或者我在哪里获取我的数据?谢谢!

以上是关于SQL Big Query 完全连接表以使用相同的过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Big Query - 使用旧版和普通 sql 时的用户数量不同

在具有相同架构的表上使用 UNION ALL 的 Google Big Query 中的 SQL 错误编辑:架构从 String 更改为 INT

使用两个不同的外键连接两个表以获得相同的字段

Big Query 或 SQL 重塑数据

Big Query (SQL) 将多列转换为行/数组

BIG QUERY SQL:使用移动参考标记滑动时间窗口上的日期