Проблемы с оператором MySQL JOIN - PullRequest
0 голосов
/ 30 января 2012

У меня есть 5 таблиц, называемых личными, ежедневная оплата, бонусы, кредиты и кредиты. Я пытаюсь написать запрос, который будет генерировать платежную ведомость из таблицы ... мой код -

 select personal.name as NAME, 
   (sum(dailypay.pay) + bonuses) - (iou.amount + loans.monthly_due)) as SALARY 
    from personal 
      join dailypay on personal.eid = dailypay.eid 
      left join bonuses on personal.eid = bonuses.eid 
      left join iou on personal.eid = iou.eid 
      left join where dailypay.date = 'specified_date' 
                  and bonuses.date_approved = 'specified_date' 
                  and iou.date_approved = 'specified_date' 
                  and loans.date = month(now()

Возвращает имя и нулевые значения заработной платы для сотрудников, у которых действительно есть записи для бонусов, iou и займов. Но я хочу суммировать их ежедневную оплату, вычитать / добавлять вычеты или дополнения возвращать значения, в случае отсутствия записи следует продолжить суммирование без каких-либо вычетов или вычитаний.

Ответы [ 2 ]

1 голос
/ 30 января 2012

Вы что-то пропустили при вставке кода, так как для таблицы 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
0 голосов
/ 30 января 2012

Кажется, что есть посторонний left join перед where и отсутствует закрывающая скобка ) в month(now()

так должно выглядеть:

select personal.name as NAME, 
(sum(dailypay.pay) + bonuses) - (iou.amount + loans.monthly_due)) as SALARY 
from personal 
  join dailypay on personal.eid = dailypay.eid 
  left join bonuses on personal.eid = bonuses.eid 
  left join iou on personal.eid = iou.eid 
  where dailypay.date = 'specified_date' 
              and bonuses.date_approved = 'specified_date' 
              and iou.date_approved = 'specified_date' 
              and loans.date = month(now())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...