Вы можете выбрать из запросов и присоединиться к ним. Для трех результатов вы хотели бы получить полные внешние объединения для случая, когда в одной из таблиц отсутствует месяц. К сожалению, MySQL не поддерживает полные внешние соединения. Если гарантируется, что в одной таблице никогда не будет месяца, а в другой нет, вы можете просто выполнить внутреннее объединение:
SELECT
CONCAT(LPAD(mnth, 2, 0), '-', yr),
s.total AS salary,
d.total AS deduction,
b.total AS bonus
FROM
(
SELECT
month(date_added) AS mnth,
year(date_added) AS yr,
sum(total_salary) AS total
FROM monthly_salary
GROUP BY month(date_added), year(date_added);
) s
JOIN
(
SELECT
month(date_added) AS mnth,
year(date_added) AS yr,
sum(amount) AS total
FROM deductions
GROUP BY month(date_added), year(date_added);
) d USING (mnth, yr)
JOIN
(
SELECT
month(date_added) AS mnth,
year(date_added) AS yr,
sum(amount) AS total
FROM bonuses
GROUP BY month(date_added), year(date_added);
) b USING (mnth, yr)
ORDER BY yr, mnth;
Если могут отсутствовать месяцы, сначала выберите все месяцы, а затем оставьте внешнее объединение. вышеуказанные подзапросы:
SELECT
CONCAT(LPAD(mnth, 2, 0), '-', yr),
s.total AS salary,
d.total AS deduction,
b.total AS bonus
FROM
(
SELECT month(date_added) AS mnth, year(date_added) AS yr
FROM monthly_salary
UNION
SELECT month(date_added) AS mnth, year(date_added) AS yr
FROM deductions
UNION
SELECT month(date_added) AS mnth, year(date_added) AS yr
FROM bonuses
) months
LEFT JOIN (...) s USING (mnth, yr)
LEFT JOIN (...) d USING (mnth, yr)
LEFT JOIN (...) b USING (mnth, yr)
ORDER BY yr, mnth;