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