【问题标题】:SQL balancy calculation Ordered by DateSQL 余额计算 按日期排序
【发布时间】:2017-07-12 19:21:07
【问题描述】:

我有 2 个表 AmountIn 和 AmountOut。

第一个表 Amountin 是这样的:

金额

+--------+--------------+-----------+
| account| date         | AmountIn  |
+--------+--------------+-----------+
| A      |  2017/2/6    | 200       |
| A      |  2017/2/5    | 100       |
| A      |  2017/2/5    | 500       |
| B      |  2017/2/1    | 1000      |
| B      |  2017/2/1    | 2000      |
| C      |  2017/1/20   | 25        |
+--------+----+---------+-----------+

第二个看起来像:

金额

+--------+--------------+-----------+
| account| date         |AmountOut  |
+--------+--------------+-----------+
| A      |  2017/2/8    | 200       |
| A      |  2017/2/7    | 100       |
| A      |  2017/2/6    | 500       |
| B      |  2017/2/2    | 1000      |
| B      |  2017/2/1    | 2000      |
| C      |  2017/1/20   | 25        |
+--------+----+---------+-----------+

现在我想要一个显示如下结果的查询: 对于帐户A

+--------+--------------+----------+-----------+------------+
| account| date         | AmountIn | AmountOut | Balancy    |
+--------+--------------+-------- -+-----------+------------+
| A      |  2017/2/8    | 0        | 200       | 0          |
| A      |  2017/2/7    | 0        | 100       | 200        |
| A      |  2017/2/6    | 200      | 0         | 300        |
| A      |  2017/2/6    | 0        | 500       | 100        |
| A      |  2017/2/5    | 100      | 0         | 600        |
| A      |  2017/2/5    | 500      | 0         | 500        |
+--------+----+---------+----------+-----------+------------+

这意味着合并两个表并将balancy 计算为:

last balance + AmountIn - AmounOut  

我的代码是:

select
    t.*,
    @sum := if(@account = account, 
                @sum + AmountIn - AmountOut,
                if((@account := account) is not null,
                    AmountIn - AmountOut, 0)
            ) balance
from (
    select
        *
    from (
        select
            1 x,
            account,
            date,
            AmountIn,
            0 AmountOut
        from AmountIn
        union all
        select
            0 x,
            account,
            date,
            0 AmountIn,
            AmountOut
        from AmountOut
    ) t order by account, date, x
) t cross join (select @account := null, @sum := 0) t2 

但它给了我日期升序的结果,我希望它按日期降序排序。我需要看到最后的操作,否则当数据丢失时,我将很难向下滚动或转到下一页 请帮忙

【问题讨论】:

  • t order by account, date desc, x
  • 在这种情况下,“平衡”会变得一团糟,不正确
  • 添加了基于非标准语法的mysql标签

标签: mysql sql join subquery union


【解决方案1】:

这是一个由 txn 到 txn 建立的平衡解决方案。我使用 unionall (没有连接)来构建初始表,如您的示例所示,您似乎不希望同时具有 amountinamountout 的行:

select * 
from (
select 
@cnt := If(@prev=account , @cnt+1,1) rown, a.*,
@balance := if(  @prev=account, @balance + amountin - amountout, amountin - amountout) balance,                                                           
@prev := account prev  from 
(select account, date, amountin, 0 amountout from amountin
union all
select account, date, 0, amountout from amountout) a, (select @cnt := 1) b, (select @prev :='') c, (select @balance :=0) bal
order by account, date
    ) r
    order by account, rown desc, date desc

Here is a working exmaple with your data

【讨论】:

  • 这个很完美很漂亮,非常感谢,如果表是3,我们再添加一个表'thirdTable',意思是'balance = lastbalance +amountin +thirdamount-amountout' 第三个表有与其他结构相同
  • 再次感谢您,并为迟到的 +1 感到抱歉,如果能提供怎么样的情况,我将不胜感激
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
相关资源
最近更新 更多