无法用文字解释我的问题,但有一个例子我可以清楚地表明:
我有一张这样的表:
id num val
0 3 10
1 5 12
2 7 12
3 11 15
我想查看所有行,并计算“num”的增加,并将该差值乘以“val”值。当我计算所有这些时,我想将这些结果加在一起。
这是我想在桌子上运行的数学方程式:
Result = (3-0)*10 + (5-3)*12 + (7-5)*12 + (11-7)*15
138 = Result
谢谢。
答案 0 :(得分:2)
您可以使用mysql变量,但每个条目仍然会获得一条记录。
select
@lastTotal := @lastTotal + ( (yt.num - @lastNum) * yt.val ) thisLineTotal,
@lastNum := yt.num as saveForNextRow,
yt.id
from
yourTable yt,
( select @lastTotal := 0,
@lastNum := 0 ) sqlvars
order by
id
这个应该给你想要确认每个记录的计算结果。
现在,要获得一个记录和一个列结果,您可以将其包装起来,例如
select
pq.thisLineTotal
from
(above entire query ) as pq
order by
pq.id DESC
limit 1
答案 1 :(得分:0)
这将给你总数。请务必按照您希望的顺序订购 - 我已按ID
订购SET @runtot:=0;
SET @prevval:=0;
select max(rt) as total FROM (
SELECT
q.val,
q.num,
(@runtot := @runtot + (q.num- @prevval) * q.val) AS rt,
(@prevval := q.num) AS pv
FROM thetable q
ORDER by ID) tot
如果您想查看计算的详细信息,请忽略外部选择:
SET @runtot:=0;
SET @prevval:=0;
SELECT
q.val,
q.num,
(@runtot := @runtot + (q.num- @prevval) * q.val) AS rt,
(@prevval := q.num) AS pv
FROM thetable q
ORDER by ID
如果您的列值可能为负数,则使用max(rt)不会为总数工作。然后你应该使用:
SET @runtot:=0;
SET @prevval:=0;
select @runtot as total FROM (
SELECT
q.val,
q.num,
(@runtot := @runtot + (q.num- @prevval) * q.val) AS rt,
(@prevval := q.num) AS pv
FROM thetable q
ORDER by ID) tot LIMIT 1
答案 2 :(得分:0)
假设您的样本数据表明ID是连续的,只需将表连接到自身:
select sum((t1.num-ifnull(t2.num,0))*t1.val) YourValue
from YourTable t1
left join YourTable t2
on t2.id = t1.id - 1;