【问题标题】:Mysql calculation in select statementselect语句中的mysql计算
【发布时间】:2013-04-25 11:38:51
【问题描述】:

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

在excel中我以前是这样做的。

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

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

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

【问题讨论】:

    标签: mysql calculated-columns cumulative-sum cumulative-frequency


    【解决方案1】:

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

    【讨论】:

    • 谢谢,这是非常有用的见解,至少现在我有一个想法,正在努力。
    【解决方案2】:

    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
    

    【讨论】:

    • 谢谢,Gordon Linoff 它运行良好。我现在明白它是如何工作的了。这只是我拥有的众多桌子之一的视图。我会对其他人做同样的事情。我也从 eggyal 那里得到了一些想法。再次感谢我已经在这方面工作了 2 天。
    【解决方案3】:
    SELECT
      sales_report.Stock_Delivered,
      sales_report.Units_Sold,
      sales_report.Stock_Delivered - sales_report.Units_Sold
    FROM
      sales_report;
    

    【讨论】:

    • OP想要累积一个累计,而不是简单地显示当天的运动。
    • @Brad 感谢您的尝试,但我认为,我之前并不清楚,我需要的计算是(“前一天库存余额”+“库存交付”-“单位告知”)
    • 啊……抱歉,不过,我很高兴你得到了正确的答案!
    • 虽然代码很受欢迎,但它应该始终有一个附带的解释。这不必很长,但在意料之中。
    猜你喜欢
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 2022-06-10
    • 2013-09-03
    • 1970-01-01
    相关资源
    最近更新 更多