Объединение 3 таблиц в одну таблицу (Объединение 4 таблиц) - PullRequest
1 голос
/ 23 апреля 2019

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

Tables and how they relate

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

Мне нужна таблица со следующими столбцами:

Desired Output

1 Ответ

1 голос
/ 23 апреля 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...