我不能用语言来解释我的问题,但举一个例子我可以清楚地展示出来:
我有一张这样的桌子:
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
谢谢。
发布于 2014-03-29 01:29:54
您可以使用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
发布于 2014-03-29 01:44:10
这将给你总数。一定要按你想要的顺序订购--我已经按身份证订购了。
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
发布于 2014-03-29 01:50:30
假设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;
http://www.sqlfiddle.com/#!2/40b9f/12
https://stackoverflow.com/questions/22725742
复制相似问题