多同列名表Join/Merge:基于日期与品牌合并三表并统一品牌列
解决方案:整合三表所有Date+Brand组合并生成目标表
你当前的查询只以Table-1作为左连接的基准表,这就导致Table-2和Table-3中独有的Date+Brand组合无法被纳入结果集。要实现包含所有表中Brand和Date的完整合并,我们需要先构建一个包含所有唯一Date+Brand组合的数据集,再基于这个数据集关联三个表获取对应字段。
完整SQL语句
SELECT ac.Date, ac.Brand, t1.Series, t1.viewers AS Table_1_Viewers, t2.amazon_viewers AS Table_2_Viewers, t3.views AS Table_3_Viewers FROM ( -- 获取三个表中所有唯一的Date+Brand组合 SELECT DISTINCT Date, Brand FROM `Table-1` UNION ALL SELECT DISTINCT Date, Brand FROM `Table-2` UNION ALL SELECT DISTINCT Date, Brand FROM `Table-3` ) AS ac LEFT JOIN `Table-1` t1 ON ac.Date = t1.Date AND ac.Brand = t1.Brand LEFT JOIN `Table-2` t2 ON ac.Date = t2.Date AND ac.Brand = t2.Brand LEFT JOIN `Table-3` t3 ON ac.Date = t3.Date AND ac.Brand = t3.Brand ORDER BY ac.Date DESC, ac.Brand;
代码说明
- 构建完整组合集:
- 用
UNION ALL合并三个表的Date和Brand字段,再通过DISTINCT去重,确保我们得到所有存在于任意一个表中的日期-品牌组合,不会遗漏任何一条独立记录。
- 用
- 左连接关联三表:
- 以完整的组合集作为主表,分别左连接
Table-1、Table-2、Table-3,关联条件都是Date和Brand的匹配。这样无论某个组合只存在于哪张表,都能被保留,不存在的字段会自动填充为NULL。
- 以完整的组合集作为主表,分别左连接
- 字段映射:
Series仅在Table-1中存在,所以从Table-1中获取,没有匹配的组合会显示NULL;- 三个观众数字段分别从对应表中取出,并重命名为你需要的格式。
期望输出结果
| Date | Brand | Series | Table_1_Viewers | Table_2_Viewers | Table_3_Viewers |
|---|---|---|---|---|---|
| 12/1/2018 | TEST | TEST_SERIES | 100 | NULL | NULL |
| 10/15/2018 | MTV | GOT | 1000 | NULL | 1000 |
| 12/1/2018 | TEST | Viking | 485632 | 856325 | NULL |
| 12/1/2018 | TEST | Another Series | NULL | 200 | NULL |
| 10/15/2018 | POGO | NULL | NULL | 1000 | NULL |
| 7/1/2019 | No_Match | TEST_SERIES | NULL | NULL | 100 |
| 12/1/2018 | TEST-5 | NULL | NULL | NULL | 953022 |
内容的提问来源于stack exchange,提问作者Rohit Chauhan
相关产品推荐
相关产品推荐

