【问题标题】:BigQuery SQL join on multiple columns, but if both are unmatched, it should add a 0 rowBigQuery SQL 连接多列,但如果两者都不匹配,则应添加 0 行
【发布时间】:2021-09-02 21:47:18
【问题描述】:

我正在尝试进行如下连接:

给定表 1:

+-----------+------+-------+
| date      | name | count |
+-----------+------+-------+
| 1.1.2020. | A    | 5     |
+-----------+------+-------+
| 1.1.2020. | B    | 2     |
+-----------+------+-------+
| 1.1.2020. | C    | 3     |
+-----------+------+-------+

和表 2:

+-----------+------+-------+
| date      | name | count |
+-----------+------+-------+
| 1.1.2020. | B    | 1     |
+-----------+------+-------+
| 1.1.2020. | C    | 4     |
+-----------+------+-------+
| 1.1.2020. | D    | 6     |
+-----------+------+-------+

我想按日期和姓名加入他们,但如果姓名不在其中一张表中,最终表应该仍然有它,计数为 0。

结果表将是

+-----------+------+---------+---------+
| date      | name | count_1 | count_2 |
+-----------+------+---------+---------+
| 1.1.2020. | A    | 5       | 0       |
+-----------+------+---------+---------+
| 1.1.2020. | B    | 2       | 1       |
+-----------+------+---------+---------+
| 1.1.2020. | C    | 3       | 4       |
+-----------+------+---------+---------+
| 1.1.2020. | D    | 0       | 6       |
+-----------+------+---------+---------+

无论我尝试哪种连接类型,它只匹配名称在两个表中的那些行,所以我只会在此处获取这两行

+-----------+------+---------+---------+
| date      | name | count_1 | count_2 |
+-----------+------+---------+---------+
| 1.1.2020. | B    | 2       | 1       |
+-----------+------+---------+---------+
| 1.1.2020. | C    | 3       | 4       |
+-----------+------+---------+---------+

这是我尝试过的查询之一,还有左连接、右连接等。

select * from 
    table_1 full outer join table_2 using(date, name)

谢谢!

【问题讨论】:

  • 您是否过度简化了示例?您是否使用不同的数据对此进行测试?你有 WHERE 子句吗?您是否测试过这个 EXACT 示例(完全相同的数据,完全相同的查询)?

标签: sql google-bigquery


【解决方案1】:

考虑以下方法

select date, name, 
  sum(if(col = 'count_1', count, 0)) count_1,
  sum(if(col = 'count_2', count, 0)) count_2
from (
  select *, 'count_1' col from table_1 union all 
  select *, 'count_2' from table_2 
)
group by date, name        

如果应用于您问题中的样本数据 - 输出是

【讨论】:

    【解决方案2】:

    考虑另一种方法 - 使用 PIVOT 运算符减少冗长

    select *
    from (
      select *, 'count_1' col from table_1 union all 
      select *, 'count_2' from table_2 
    )
    pivot (sum(count) for col in ('count_1', 'count_2')) 
    

    如果应用于您问题中的样本数据 - 输出是

    【讨论】:

      【解决方案3】:

      您的查询应该有效,但我将其表述为:

      select date, name, coalesce(t1.count, 0) as count_1,
             coalesce(t2.count, 0) as count_2
      from table_1 t1 full outer join
           table_2 t2
           using (date, name);
      

      这会将附加计数返回为0,而不是NULL

      【讨论】:

      • 它仍然只返回在两个表中都找到的名称的行..
      • @nexx 。 . .这是不可能的。这将返回两个表中的所有名称,除非您添加了其他逻辑,例如 where 子句。
      猜你喜欢
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      相关资源
      最近更新 更多