【问题标题】:MySQL query to generate only negative daily differencesMySQL 查询仅生成负的每日差异
【发布时间】:2019-02-02 12:48:37
【问题描述】:

我正在学习 mysql,并且很难理解更复杂的输出 - 主要是逻辑部分......我有一个简单的数据库,其中包含 2 个表和 1 个连接 - 设计在这里https://prnt.sc/mfmwji

我需要创建一个报告,仅显示过去 6 个月的负数状态(因此仅当人处于负数状态时)的每日余额。

我整理了一个查询,当它们为负时只显示差异,但它不会将它们“连接”到它们之前的行......只能显示撤回可以这么说。 我玩过查询,但这是我想出的“最好”的东西......我试图用 sum 函数来包装差异,但这只是总结了整个事情并且不会返回每日差异。

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 的其他问题,但它们通常指向其他问题,而不是针对我的问题。

提前感谢您认为我应该查看的任何信息!

【问题讨论】:

  • 我们需要示例数据和预期结果(没有图像)如果没有,很难阅读查询或给出可靠的 cmets/answers.. 我建议您阅读 Why should I provide an MCVE for what seems to me to be a very simple SQL query?
  • 你用的是哪个版本的mysql?
  • db-fiddle.com/f/nRXgyePFoF8VPax3NxMQNp/0 我听过@RaymondNijland 并添加了一些内容,因此你们可以更深入地了解查询并尝试更详细的内容。 MySQL是5.6.34版本
  • 你能不能只为Shanel Torp 做一个更小的SQL fiddle(例如)和基于该数据的预期结果,你可以使用tool 来生成格式化文本。这样我们可以验证我们的查询,我们可以查看和使用的数据更少。
  • 我只在她的交易中添加了 Shanel Torp - 不明白如何使用您链接的工具将 2 个表格放入其中,所以我再次使用小提琴 db-fiddle.com/f/uK5bDWYPDVx5UdyFKyzPr/0

标签: php mysql logic


【解决方案1】:

您可以使用子查询来检索最新的余额。然后,在外部查询中,您可以筛选出余额为负数的地方:

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

【讨论】:

  • 哇,你是下一个级别的先生!真的非常感谢!
【解决方案2】:

这是你问的。它显示一个用户的报告。我不知道是否有办法同时为所有用户制作这个。也许它可以帮助你找到你想要的。

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

【讨论】:

  • 我已将数据库添加到 db-fiddle db-fiddle.com/f/nRXgyePFoF8VPax3NxMQNp/0 中,您可以在其中查看查询 - 我已尝试运行您的查询,但结果不是我想要的。谢谢你的帮助!欣赏它
  • 您期待什么结果?当您说“它不会将它们'连接'到它们之前的行”时,我不明白
  • 所以我想输出为负余额的行 - 所以当那天提款大于正余额时 - 并显示提款发生当天的金额(原因负余额) - 我解释得更好吗?这很难,因为英语不是我的主要语言
  • 但是您的请求不是已经完成了吗?它显示了当天所有余额为负的交易?
  • 或者你想把这个人之前的所有存款和取款都算进去,并有当天的账户余额?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
  • 2015-12-08
相关资源
最近更新 更多