Вы что-то пропустили при вставке кода, так как для таблицы loans
нет соединения.Кроме того, вы используете таблицу bonuses
в качестве значения, вам также нужно имя поля.Я добавил некоторый код для объединения и для поля, но использовал ???
для имен, которые мне неизвестны.
Когда вы добавляете или вычитаете пустое значение к чему-то другому, результат равен нулю, поэтомувы получите нулевое значение как результат, если отсутствуют какие-либо значения из таблиц, соединенных слева.Вы можете использовать ifnull(..., 0)
, чтобы превратить нулевое значение в ноль.
Вам понадобится предложение group by
, в противном случае сумма всех зарплат будет суммирована.
Если я вас правильно понял, у вас есть несколько записей в таблице dailypay
для каждого пользователя, но только одна запись на пользователя в других таблицах?В этом случае у вас есть проблема с тем, что вы будете объединять другие таблицы с каждой строкой в dailypay
, поэтому, если у вас есть 20 платежных записей для пользователя, бонус будет учитываться 20 раз.Вы можете использовать агрегат, такой как max
, чтобы получить значение только один раз.
Вы поставили условия для таблиц left.joined в предложении where
, но это превратит объединения во внутренние объединения.Вы должны иметь эти условия в каждом предложении join
.
select
personal.name as NAME,
(sum(dailypay.pay) + ifnull(max(bonuses.???), 0)) - (ifnull(max(iou.amount), 0) + ifnull(max(loans.monthly_due), 0)) as SALARY
from
personal
inner join dailypay on personal.eid = dailypay.eid
left join bonuses on personal.eid = bonuses.eid and bonuses.date_approved = 'specified_date'
left join iou on personal.eid = iou.eid and iou.date_approved = 'specified_date'
left join loans on personal.??? = loans.??? and loans.date = month(now())
where
dailypay.date = 'specified_date'
group by
personal.name