Используйте условное агрегирование.
SELECT `id_user`,
SUM(`sum`) `sum_month`,
SUM(`sum` * (`date` >= NOW() - INTERVAL 1 WEEK)) `sum_week`,
SUM(`sum` * (`date` >= NOW() - INTERVAL 1 DAY)) `sum_day`,
users.name
FROM `balance_history`
INNER JOIN `users` ON `id_user` = users.id
WHERE `date` >= NOW() - INTERVAL 1 MONTH
AND `type` = 'plus'
GROUP BY `id_user`, users.name
ORDER BY `sum` DESC
Выражения-аргументы SUM() - это упрощённое выражение типа
SUM(CASE WHEN {some condition}
THEN {some value}
ELSE 0
END)
Ну а WHERE ещё и позволяет не трясти более древние записи, которые заведомо не учитываются ни в одной из сумм. Поэтому оно отбирает самый длительный из периодов суммирования, а заодно избавляет от условия агрегирования одно из выражений.