3

我一直在做Excel的办公室工作,我的记录变得太多了,想用mysql.i有一个从数据库视图它有列“日期,stockdelivered,销售”我想添加另一个称为“库存余额”的计算字段。 我知道这应该是在数据录入期间在客户端完成的。 我有一个脚本,只生成基于视图和表的PHP列表/报告,它没有添加计算字段的选项,所以我想如果可能的话在MySQL中查看。Mysql在select语句中的计算

在excel中,我用它来做如下。

enter image description here

我想知道这是否可能在MySQL。

enter image description here

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

如果还有其他方法可以实现同样的输出请建议。

回答

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 
+0

感谢Gordon Linoff,它的工作很完美。现在我明白了这是如何工作的。这只是我所拥有的众多表格中的一种。我也会对其他人做同样的事情。我也从eggyal那里得到了一些想法。再次感谢我已经2天了。 – Law 2013-05-01 14:26:19

0
SELECT 
    sales_report.Stock_Delivered, 
    sales_report.Units_Sold, 
    sales_report.Stock_Delivered - sales_report.Units_Sold 
FROM 
    sales_report; 
+1

该OP想积累运行总数,而不是简单地显示一天的运动。 – eggyal 2013-05-01 13:31:08

+0

@布拉德感谢您的尝试,但我认为,我以前并不清楚,我需要的计算是(“前一天的库存余额”+“库存交付” - “单位告诉”) – Law 2013-05-01 13:34:03

+0

Ahh ..sorry'回合 - 我虽然你确实得到了正确的答案,但很开心! – Brad 2013-05-01 14:30:04

6

一般来说,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 
    
+0

谢谢,这是非常有用的见解,至少现在我有一个想法,正在努力。 – Law 2013-05-01 14:17:59