Объединение 3 таблиц в одну таблицу (объединение 4 таблиц)

#mysql #sql #join

#mysql #sql #Присоединиться

Вопрос:

У меня есть 3 таблицы продаж и 1 таблица продуктов, которая содержит все идентификаторы продуктов. Мне нужно объединить таблицы продаж с таблицей продуктов, чтобы получать еженедельные продажи.

Таблицы и как они связаны

Я попробовал несколько разных методов объединения и объединений. Каждый раз, когда я получаю неправильный вывод (либо слишком много, либо что-то вроде перекрестного соединения). В настоящее время у меня есть 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';
  

Мне бы нужна таблица, содержащая следующие столбцы:

Желаемый результат

Ответ №1:

Вам нужно включить неделю в объединения, чтобы вы просто получали данные за эту неделю из каждой таблицы.

 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 JOIN , чтобы сделать продажи необязательными для 2 таблиц. Но чтобы сделать это необязательным для всех 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 удаляет дубликаты, поэтому вы не будете получать несколько строк за каждую неделю.

Комментарии:

1. Первый вариант, добавление недель в объединения, дал мне именно то, что мне было нужно. Большое вам спасибо. Я не уверен, почему я не подумал о необходимости указывать недели для каждой из таблиц. Второй набор кода с объединением также пригодится для другой подобной ситуации, которая у меня есть. Еще раз спасибо!