Проблема в том, что вы не гарантируете, что у вас есть запись, когда не было платежей ни в январе, ни в феврале, а также вы не гарантируете, что у вас есть одна запись для каждой логической пары января и февраля для одного и того жепользователь.Вам нужно будет использовать LEFT JOIN
, чтобы убедиться, что у вас есть строка для каждого пользователя, и вам нужно убедиться, что у вас есть одна строка для каждого логического кортежа.Я не понимаю логику вашего where
состояния, поэтому я могу ошибаться.Я предполагаю, что одна запись хранится в январе или феврале, если была какая-либо оплата:
SELECT DISTINCT
u.id_user,
u.first_name,
u.last_name,
pv.year as year,
pv.base_salary,
CASE
WHEN pv.month = 'January' THEN pv.total_salary
ELSE 0
END as January,
CASE
WHEN pv.month = 'February' THEN pv.total_salary
ELSE 0
END as February,
FROM users u
LEFT JOIN payroll_variable jan ON u.id_user = jan.id_user
LEFT JOIN payroll_variable feb ON feb.id_user = u.id_user
WHERE jan.status <> 'submit' and feb.status <> 'submit' and (not (jan.id_user is null) or not (feb.id_user is null))
Этот код не проверен, и возможно, что я неправильно понял ваше намерение.
РЕДАКТИРОВАТЬ
Чтобы сгруппировать результаты по пользователям, вам нужно будет использовать group by:
select id_user, first_name, last_name, max(t.year), max(base_salary), sum(January) as January, sum(February) as February
from (
SELECT
u.id_user,
u.first_name,
u.last_name,
min(pv.year) as year,
min(pv.base_salary) as base_salary,
sum(case when pv.payroll_month = 'January' then pv.total_salary else 0 end) as January,
sum(case when pv.payroll_month = 'February' then pv.total_salary else 0 end) as February
FROM users u
LEFT JOIN payroll_variable pv ON u.id_user = pv.id_user) t
group by t.id_user, t.first_name, t.last_name