Я не думаю, что можно получить, что ожидаемый результат без подзапроса, как вам нужно сгруппировать по месяцам и хранить из двух разных таблиц, возможно, имеющих много строк в каждой группе и объединяя их вместе, прежде чем группировать будет умножать строки. Более того, вам нужно выполнить полное внешнее объединение этих результатов, которое в 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
Запрос не работает для меня. Кстати, есть ли другой способ создать новую таблицу из этих существующих таблиц, чтобы получить результат оттуда – Joshi
Просьба уточнить, как именно она не работает для вас. Если вы видите какое-либо сообщение об ошибке, напишите это сообщение здесь, если оно дает разные результаты, чем вы ожидаете от данных примера, и что вы должны получить, и так далее. Также убедитесь, что вы копируете полный запрос, так как он не подходит в окне, и вам нужно прокрутить вниз, чтобы увидеть все. – piotrm