Присоединиться к другому столу и тому же столу - PullRequest
0 голосов
/ 21 сентября 2018

нужна ваша помощь. Я работал над этим запросом в течение дня. Lol

У меня есть 2 таблицы

. Таблица пользователей

enter image description here

и таблица payroll_variable

enter image description here

Мои цели - присоединиться к пользователям таблицы с двумя или более таблицами payroll_variable, подобными

enter image description here

Это то, что я делаю до сих пор:

      SELECT  DISTINCT
                u.id_user,
                u.first_name,
                u.last_name,
                pv.year,
                pv.base_salary,
                CASE
                    WHEN pv.month = 'January' THEN pv.total_salary
                    ELSE NULL
                END as 'January',
                CASE
                    WHEN pv1.month = 'February' THEN pv1.total_salary
                    ELSE NULL
                END as 'February'
        FROM payroll_variable pv
        INNER JOIN users u ON u.id_user = pv.id_user
        INNER JOIN payroll_variable pv1 ON  pv1.id_user = pv.id_user
        WHERE pv.status != 'submit'

И это неверный результат моего запроса

enter image description here

Проблема в том, что я просто хочу показать каждому пользователю только один цикл, как мои цели, и не обращайте внимания на мое предложение WHERE, это просто для пометки

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Прежде всего, я изменил имя двух полей в моем запросе, т.е. месяц и год, на payroll_month и payroll_year.

Вот запрос, который даст вам желаемый результат

Select u.id_user, u.first_name, u.last_name, pv.payroll_year, pv.base_salary,
sum(IF(pv.payroll_month = 'January', pv.total_salary, 0)) as 'January',
sum(IF(pv.payroll_month = 'February', pv.total_salary, 0)) as 'February',
sum(IF(pv.payroll_month = 'March', pv.total_salary, 0)) as 'March',
sum(IF(pv.payroll_month = 'April', pv.total_salary, 0)) as 'April',
sum(IF(pv.payroll_month = 'May', pv.total_salary, 0)) as 'May',
sum(IF(pv.payroll_month = 'June', pv.total_salary, 0)) as 'June',
sum(IF(pv.payroll_month = 'July', pv.total_salary, 0)) as 'July',
sum(IF(pv.payroll_month = 'August', pv.total_salary, 0)) as 'August',
sum(IF(pv.payroll_month = 'September', pv.total_salary, 0)) as 'September',
sum(IF(pv.payroll_month = 'October', pv.total_salary, 0)) as 'October',
sum(IF(pv.payroll_month = 'November', pv.total_salary, 0)) as 'November',
sum(IF(pv.payroll_month = 'December', pv.total_salary, 0)) as 'December'
from users u join payroll_variable pv using(id_user)
group by u.id_user

И образец вывода, как на изображении

0 голосов
/ 21 сентября 2018

Проблема в том, что вы не гарантируете, что у вас есть запись, когда не было платежей ни в январе, ни в феврале, а также вы не гарантируете, что у вас есть одна запись для каждой логической пары января и февраля для одного и того жепользователь.Вам нужно будет использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...