6

我一直在用 Excel 做我的办公室工作。我的记录变得太多了,想使用 mysql。我从 db 有一个视图,它有列“日期、库存交付、销售”我想添加另一个计算字段,称为“库存余额”。我知道这应该在数据输入期间在客户端完成。我有一个仅基于视图和表格生成 php 列表/报告的脚本,它没有添加计算字段的选项,所以如果可能的话,我想在 mysql 中创建一个视图。

在excel中我曾经这样做如下。

在此处输入图像描述

我想知道这在mysql中是否可行。

在此处输入图像描述

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

如果有其他方法可以实现相同的输出,请提出建议。

4

3 回答 3

10

一般来说,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. 在用户变量中累积运行总计:

    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
    
于 2013-05-01T13:30:46.100 回答
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
于 2013-05-01T13:47:39.503 回答
0
SELECT
  sales_report.Stock_Delivered,
  sales_report.Units_Sold,
  sales_report.Stock_Delivered - sales_report.Units_Sold
FROM
  sales_report;
于 2013-05-01T13:26:41.583 回答