select语句中的mysql计算

时间:2013-05-01 13:09:28

标签: mysql calculated-columns running-total cumulative-frequency

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

在excel中,我曾经这样做过。

enter image description here

我想知道这是否可以在mysql中使用。

enter image description here

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

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

3 个答案:

答案 0 :(得分: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
    
  4. user variable中累计总计:

    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
    

答案 1 :(得分: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

答案 2 :(得分:0)

SELECT
  sales_report.Stock_Delivered,
  sales_report.Units_Sold,
  sales_report.Stock_Delivered - sales_report.Units_Sold
FROM
  sales_report;