select语句中的mysql计算
Posted
技术标签:
【中文标题】select语句中的mysql计算【英文标题】:Mysql calculation in select statement 【发布时间】:2013-04-25 11:38:51 【问题描述】:我一直在 Excel 中做我的办公室工作。我的记录变得太多,想使用 mysql。我从 db 有一个视图,它有列“日期、库存交付、销售”我想添加另一个计算字段称为“库存余额”。 我知道这应该在数据输入期间在客户端完成。 我有一个仅基于视图和表格生成 php 列表/报告的脚本,它没有添加计算字段的选项,所以如果可能的话,我想在 mysql 中创建一个视图。
在excel中我以前是这样做的。
我想知道这在 mysql 中是否可行。
我对我的 sql 没有太多经验,但我先想象一下 必须能够选择上一行。colomn4 然后将其添加到当前 row.colomn2 减去当前 row.colomn3
如果有其他方法可以实现相同的输出,请提出建议。
【问题讨论】:
【参考方案1】:一般来说,SQL 并不是真正想要产生您想要的“运行总计”。其他 RDBMS 引入了专有扩展来提供支持此类计算的分析功能,但 MySQL 缺乏此类功能。
相反,一个大致有四个选项。排名不分先后:
在您的应用程序中累积运行总计,因为您循环遍历结果集;
更改架构以跟踪数据库中的运行总数(在这种情况下尤其有用,新数据只会附加到“末尾”);
对自加入进行分组:
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
在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 感谢您的尝试,但我认为,我之前并不清楚,我需要的计算是(“前一天库存余额”+“库存交付”-“单位告知”) 啊……抱歉,不过,我很高兴你得到了正确的答案! 虽然代码很受欢迎,但它应该始终有一个附带的解释。这不必很长,但在意料之中。以上是关于select语句中的mysql计算的主要内容,如果未能解决你的问题,请参考以下文章
SQL初级SQL简介语法SELECT语句SELECT DISTINCT语句