#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. Первый вариант, добавление недель в объединения, дал мне именно то, что мне было нужно. Большое вам спасибо. Я не уверен, почему я не подумал о необходимости указывать недели для каждой из таблиц. Второй набор кода с объединением также пригодится для другой подобной ситуации, которая у меня есть. Еще раз спасибо!