MySQL запрос, чтобы генерировать только отрицательные ежедневные различия - PullRequest
0 голосов
/ 02 февраля 2019

Я изучаю mysql, и мне трудно разобраться с более сложными выводами - в основном, с логической частью ... У меня есть простая база данных, которая содержит 2 таблицы с 1 соединением - дизайн здесь https://prnt.sc/mfmwji

Мне нужно создать отчет, который отображает ежедневный баланс только отрицательных состояний (так, только если у человека отрицательный баланс) за последние 6 месяцев.

Я собрал запрос, который отображает только различиякогда они отрицательные, но они не «соединяют» их со строками перед ними ... только отображает изъятия, так сказать.Я поиграл с запросом, но это «лучшая» вещь, которую я придумал ... Я пытался обернуть разницу с помощью функции суммы, но она просто суммирует все и не возвращает дневную разницу.

SELECT
    T1.name AS Name,
    T2.withdraw - T2.deposit AS Difference,
    DATE_FORMAT(T2.date, '%Y-%m-%d') AS Date
FROM
    users AS T1
INNER JOIN transactions AS T2
ON
    T1.id = T2.user_id
WHERE
    (T2.withdraw - T2.deposit) > 0

Запрос возвращает эти выходные данные (это только часть результата, так как я получил 100 результатов) http://prntscr.com/mfn0xf

Депозиты и выплаты для Pearl Champlin, поэтому вы понимаете, что:http://prntscr.com/mfn15a

Я пытался проверить другие вопросы по SO, но они обычно указывают на другие проблемы и не относятся к моей проблеме.

Заранее спасибо за любую информацию, которую вы считаете нужнымпроверить!

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Вы можете использовать подзапрос для получения баланса в актуальном состоянии.Затем во внешнем запросе вы можете отфильтровать, где этот баланс отрицателен:

select   *
from     (
          select      u.name,
                      t.date,
                      t.deposit - t.withdraw action,
                      ( select sum(deposit - withdraw)
                        from   transactions
                        where  user_id = u.id
                        and    date <= t.date ) as balance
          from        users as u
          inner join  transactions as t
                  on  u.id = t.user_id
         ) balances
where    balance < 0       
order by 1, 2
0 голосов
/ 02 февраля 2019

Это то, что вы спросили.Показывает отчет для одного пользователя.Я не знаю, есть ли способ сделать это для всех пользователей одновременно.Может быть, это поможет вам найти то, что вы хотите.

SELECT
    PreAgg.name,
    (PreAgg.withdraw - PreAgg.deposit) AS Difference,
    @PrevBal := @PrevBal + (PreAgg.withdraw - PreAgg.deposit) AS Balance
FROM
    (SELECT
        T1.name,
        T2.deposit,
        T2.withdraw,
        (T2.withdraw - T2.deposit) AS Difference,
        T1.id
     FROM
        users AS T1
     INNER JOIN transactions AS T2
     ON
        T1.id = T2.user_id
     ORDER BY
        T2.id ) AS PreAgg,
       (SELECT @PrevBal := 0) as InitialVar
WHERE PreAgg.id = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...