2012-01-15 2 views
0

Я пытаюсь объединить данные из двух таблиц продаж & покупки в одной таблице. Оба Sales & Приобретайте таблицу с внешним ключом из третьего хранилища таблиц.MYSQL запрос для объединения данных из двух таблиц, разделяющих внешний ключ из третьей таблицы

Каков наилучший способ построения запроса для получения результатов точно так же, как в таблицах результатов, желательно (если возможно) без использования подзапроса, поскольку мне нужно создать представление результата запроса, а MYSQL не разрешить создание представления по запросу с использованием подзапроса.

Я пробовал выбирать с объединением, но не получал результат, как ожидалось.

underlying tables & query result

ответ

0

Следующий запрос (не проверено) должен дать ResultSet вы хотите:

SELECT store_name AS store, MONTH(sales.date) AS month, SUM(sales.sales) AS sales, SUM(purchase.purchase) AS purchase 
FROM store 
JOIN sales ON store.store_id = sales.store_id 
JOIN purchase ON store.store_id = purchase.store_id 
GROUP BY store.store_id,MONTH(sales.date), MONTH(purchase.date) 
0

Я не думаю, что можно получить, что ожидаемый результат без подзапроса, как вам нужно сгруппировать по месяцам и хранить из двух разных таблиц, возможно, имеющих много строк в каждой группе и объединяя их вместе, прежде чем группировать будет умножать строки. Более того, вам нужно выполнить полное внешнее объединение этих результатов, которое в mysql не поддерживается, и вы должны подражать ему объединением двух противоположных левых соединений. Таким образом, в основном с этой схемой таблицы вы должны использовать запрос, который является довольно сложным и больше похож на академическую проблему, чем на реальный пример жизни.

(SELECT st.store_name, s.month, 
      COALESCE(s.salestotal, 0) as salestotal, 
      COALESCE(p.purchasetotal, 0) as purchasetotal 
FROM 
    store st 
    JOIN 
    (SELECT store_id, SUM(sales) as salestotal, 
      DATE_FORMAT(date, '%b %Y') as month 
     FROM sales 
     GROUP BY store_id, month) s 
    ON st.store_id = s.store_id 
    LEFT JOIN 
    (SELECT store_id, SUM(purchase) as purchasetotal, 
     DATE_FORMAT(date, '%b %Y') as month 
     FROM purchase 
     GROUP BY store_id, month) p 
    ON p.store_id = s.store_id AND p.month = s.month) 
UNION 
(SELECT st.store_name, p.month, 
      COALESCE(s.salestotal, 0) as salestotal, 
      COALESCE(p.purchasetotal, 0) as purchasetotal 
FROM 
    store st 
JOIN 
    (SELECT store_id, SUM(purchase) as purchasetotal, 
      DATE_FORMAT(date, '%b %Y') as month 
    FROM purchase 
    GROUP BY store_id, month) p 
ON st.store_id = p.store_id 
LEFT JOIN 
    (SELECT store_id, SUM(sales) as salestotal, 
    DATE_FORMAT(date, '%b %Y') as month 
    FROM sales 
    GROUP BY store_id, month) s 
ON 
    p.store_id = s.store_id AND p.month = s.month) 
ORDER BY month, store_name 
+0

Запрос не работает для меня. Кстати, есть ли другой способ создать новую таблицу из этих существующих таблиц, чтобы получить результат оттуда – Joshi

+0

Просьба уточнить, как именно она не работает для вас. Если вы видите какое-либо сообщение об ошибке, напишите это сообщение здесь, если оно дает разные результаты, чем вы ожидаете от данных примера, и что вы должны получить, и так далее. Также убедитесь, что вы копируете полный запрос, так как он не подходит в окне, и вам нужно прокрутить вниз, чтобы увидеть все. – piotrm

Смежные вопросы