首页 > 解决方案 > 将 3 个表连接到一个表(Joining 4 Tables)

问题描述

我有 3 个销售表和 1 个包含所有产品 ID 的产品表。我需要将销售表与产品表结合起来以获得每周销售额。

表格以及它们之间的关系

我尝试了几种不同的连接方法和联合。每次我得到错误的输出(要么太多,要么像交叉连接)。目前,我运行 3 个不同的查询,导出这些表并在 Excel 中手动组合这些表。

我尝试过的连接示例。

SELECT p1.product, p2.week, 
       p2.sales, p2.QTY,
       p3.sales, p3.QTY, 
       p4.sales, p4.QTY
FROM products_table p1 INNER JOIN aplha_sales p2 ON p1.alpha_product_id = p2.alpha_product_id
                       INNER JOIN beta_sales p3 ON p1.beta_product_id = p3.beta_product_id
                       INNER JOIN delta_sales p4 ON p1.delta_id = p4.delta_product_id
WHERE p2.week >= '2019-04-19';

我想要一个包含以下列的表格:

期望的输出

标签: mysqlsqljoin

解决方案


您需要在联接中包含周,以便您只需从每个表中获取该周的数据。

SELECT p1.product, p2.week, 
       p2.sales, p2.QTY,
       p3.sales, p3.QTY, 
       p4.sales, p4.QTY
FROM products_table p1 
INNER JOIN aplha_sales p2 ON p1.alpha_product_id = p2.alpha_product_id
INNER JOIN beta_sales p3 ON p1.beta_product_id = p3.beta_product_id AND p3.week = p2.week
INNER JOIN delta_sales p4 ON p1.delta_id = p4.delta_product_id AND p4.week = p2.week
WHERE p2.week >= '2019-04-19';

请注意,这只会在所有 3 种产品都有销售的几周内生成行。您可以使用LEFT JOIN2 表的可选销售。但是要使其对所有 3 个XXX_sales表都是可选的,您需要与另一个定义所需周数的表连接,然后LEFT JOIN与所有销售表连接。

SELECT p1.product, w.week, 
       p2.sales, p2.QTY,
       p3.sales, p3.QTY, 
       p4.sales, p4.QTY
FROM products_table p1 
CROSS JOIN (
    SELECT week FROM alpha_sales WHERE week >= '2019-04-19'
    UNION
    SELECT week FROM beta_sales WHERE week >= '2019-04-19'
    UNION
    SELECT week FROM delta_sales WHERE week >= '2019-04-19') AS w
LEFT JOIN aplha_sales p2 ON p1.alpha_product_id = p2.alpha_product_id AND p2.week = w.week
LEFT JOIN beta_sales p3 ON p1.beta_product_id = p3.beta_product_id AND p3.week = w.week
LEFT JOIN delta_sales p4 ON p1.delta_id = p4.delta_product_id AND p4.week = w.week

子查询中的UNION将组合任何销售表中的所有周。默认情况下,UNION删除重复项,因此您不会每周获得多行。


推荐阅读