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 = ?;
以下对于这种方法很重要:
date
和 country
需要在两个查询中具有相同的名称。
需要using
子句。由于该子句,此处更简单的语法有效。
在select
或where
中没有使用表别名来限定date
和country
。
您也可以使用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