如何在MySQL中获取当前列与前一列的总和

y0u0uwnf  于 2023-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(144)

我有一个查询,得到quantity1,value1,total1我想得到的是下面的结果

quantity 1, value 1, total 1, sum quantity,  sum total / sum quantity as value summ, sum total
80 - 3.8 - 304 , 80 - 3.8 - 304
40 - 3.75 - 150, 120 - 3.783 - 454
40 -  3.8 -  152, 160 - 37875 - 606

也就是说,能够获得总和的总和,(总和1 +先前的总和)然后与数量1相除
我试过用

SELECT 
@prev:= @prev + total 1 as column1,  @prev / quantity 1   as value
from table;

但我没有得到预期的结果
使用MySQL 5.6和Windows S.O

6pp0gazn

6pp0gazn1#

您可以使用用户定义的变量来实现所需的结果。下面是一个计算累计和和除法的示例查询:

SET @prev := 0;
SELECT
  quantity,
  value,
  total,
  @prev := @prev + total AS cumulative_total,
  (@prev / quantity) AS value_summ,
  @prev AS sum_total
FROM
  table_name;

确保将table_name替换为表的实际名称。
此查询将@prev变量初始化为0。然后,它选择列quantity、value和total,并使用用户定义的变量@prev执行计算,以计算累计总和和除法。结果显示在列中:quantity、value、total、cumulative_total、value_summ和sum_total。
请注意,用户定义的变量是特定于会话的,因此@prev变量将在同一会话中保留其值。如果在同一会话中多次运行此查询,请确保通过执行SET @prev:= 0;在运行查询之前再次执行。

vof42yt1

vof42yt12#

如果不使用order by子句,@prev值的结果将是不确定的。你需要有一个列(id,timestamp...)来唯一地标识你的行的顺序,这样SQL就可以正确地确定前一个值是什么。
根据您的示例数据,考虑以下示例:

set @sum_quantity =0;
set @sum_total =0;
set @prev_tot_sum =0;

select *,
  @sum_quantity := @sum_quantity + quantity1 as sum_quantity,
  @sum_total := @sum_total + total1 as sum_total,
  @sum_total / @sum_quantity as 'sum total / sum quantity',
  @sum_total / quantity1 as 'value'
from table_name
order by id

demo

wswtfjt7

wswtfjt73#

如果您使用MySQL 5.6,并希望在一个查询中得到答案

SELECT 
id, 
quantity1,
value1,
@sum_quantity:=@sum_quantity+quantity1 AS sumQuantity,
@sum_total:=@sum_total+total1 AS sumTotal,
@sum_total/@sum_quantity AS sumTotalBySumQuantity,
@sum_total/quantity1 AS val
FROM 
(SELECT 
  *,
  @sum_quantity:=0,
  @sum_total:=0, 
  @prev_tot_sum:=0
FROM
  table_name t ) a

这个应该能用

相关问题