select语句中的mysql计算

Law*_*Law 4 mysql calculated-columns running-total cumulative-frequency

我一直在Excel办公室工作.我的记录变得太多了,想要使用mysql.i有一个来自db的视图它有"date,stockdelivered,sales"列我想添加另一个计算字段,称为"库存余额".我知道这应该是在数据输入期间在客户端完成的.我有一个脚本,只根据视图和表生成php列表/报告,它没有添加计算字段的选项,所以我想在可能的情况下在mysql中创建一个视图.

在excel中,我曾经如下做过.

在此输入图像描述

我想知道这是否可能在mysql中.

在此输入图像描述

我对我的sql没有太多经验,但我想第一个必须能够选择前一行.colomn4然后将其添加到当前row.colomn2减去当前row.colomn3

如果有另一种方法可以实现相同的输出请建议.

egg*_*yal 7

一般来说,SQL并不是真的想要像你想要的那样产生"运行总数".其他RDBMS已经引入了专有扩展来提供分析功能,这些功能可以实现这种计算,但是MySQL缺乏这样的功能.

相反,一个广泛有四种选择.没有特别的顺序:

  1. 在循环结果集时,累积应用程序中的运行总计;

  2. 改变你的模式以跟踪数据库中的运行总数(特别是在这样的情况下,新数据只被"追加到最后");

  3. 分组自我加入:

    SELECT   a.Sale_Date,
             SUM(a.Stock_Delivered)                AS Stock_Delivered,
             SUM(a.Units_Sold)                     AS Units_Sold,
             SUM(b.Stock_Delivered - b.Units_Sold) AS `Stock Balance`
    FROM     sales_report a
        JOIN sales_report b ON b.Sale_Date <= a.Sale_Date
    GROUP BY a.Sale_Date
    
    Run Code Online (Sandbox Code Playgroud)
  4. 累计用户变量中的运行总计:

    SELECT   Sale_Date,
             Stock_Delivered,
             Units_Sold,
             @t := @t + Stock_Delivered - Units_Sold AS `Stock Balance`
    FROM     sales_report, (SELECT @t:=0) init
    ORDER BY Sale_Date
    
    Run Code Online (Sandbox Code Playgroud)


Gor*_*off 3

Eggyal 有四个很好的解决方案。我认为在 MySQL 中进行运行总计的最干净的方法是使用相关子查询——它消除了group by最后的 。所以我会添加到选项列表中:

SELECT sr.Sale_Date, sr.Stock_Delivered, sr.Units_Sold,
       (select SUM(sr2.Stock_Delivered) - sum(sr2.Units_Sold)
        from sales_report sr2
        where sr2.sale_date <= sr.sale_date
       ) as StockBalance
FROM  sales_report sr
ORDER BY Sale_Date
Run Code Online (Sandbox Code Playgroud)