每天自动往一张表中插入相同ID不同日期的数据;现在要从表中按日期查询提取某个时间段所有ID的第一次插入数量,中间所有减少的数量之和,和中间所有增加的数量之和。如:1~3号 ID 为1的插入数量分别为20,10,30.此时查询出来显示只有一条ID1的原数量是20,减少数量10,增加数量20,结余数量30.这个要如何实现,尽量简单
就你的表,看不出哪个是原数量,哪个是减少数量,哪个是增加数量
建议你减少数量用负数表示,这样可以
select sum(sl) from table group by id
先将你查询的时间范围的数据按照id和kcid由小到大进行排序,然后查出相同id相邻的两个纪录之间的差值(kcid大的对应sl减kcid小的对应sl),最后按照id进行分组min(kcid)对应sl为原数量,差值小于0的相加为减少量,差值大于0的相加为增加量,max(kcid)对应sl为结余数量
SELECT t3.id,t4.sl AS 原始量,t3.reduce_sl AS 减少量,t3.increase_sl AS 增加量,t5.sl AS 结余数量
FROM
(SELECT t.id,MIN(kcid) AS min_kcid,
sum(CASE WHEN change_sl sum(CASE WHEN change_sl>0 THEN change_sl ELSE 0 END) increase_sl
,MAX(kcid) AS max_kcid
FROM
(SELECT CASE WHEN @id=t1.id THEN t1.sl-@sl ELSE 0 END AS change_sl,
@id:=t1.id AS id,@sl:=t1.sl AS sl,t1.kcid
FROM (查询的时间范围的数据按照id和kcid由小到大进行排序的子查询) t1,(SELECT @id:=0,@sl:=0) t2) t
GROUP BY 1
) t3
LEFT JOIN
(查询的时间范围的数据按照id和kcid由小到大进行排序的子查询) t4
ON
t3.id=t4.id AND t3.min_kcid=t4.kcid
LEFT JOIN
(查询的时间范围的数据按照id和kcid由小到大进行排序的子查询) t5
ON
t3.id=t5.id AND t3.max_kcid=t5.kcid
大概就是这样写的