以下是SQLFiddle - http://sqlfiddle.com/#!2/b652d/1中此设置的链接
我想找到所有做过前测和后测的学生。然后,我想得到一个从预测试到后测试的总体百分比变化。
下面是我的查询,它没有返回测试后的任何结果:
SELECT studid, TestDate, pre, post, ROUND( (
( post - pre ) / pre ) *100, 1 ) AS percentChange
FROM bodpod
WHERE ID2 = 'fall'
AND studid != ''
GROUP BY studid
HAVING COUNT( DISTINCT ID1 ) >1
AND TestDate LIKE '%2013%'以下是一个学生的样本数据:

我怎样才能重写这个查询,以获得预期的结果,对于所有在2013年秋季参加预测试和后测的学生来说,这是一个整体百分比的变化。
发布于 2013-12-10 00:28:48
编辑2:
在查看了小提琴中的数据,并猜测原始数据已经是百分比之后,我建议如下:
select round(sum(After)/count(After) - sum(B4)/count(B4), 2) '% Change' from
(select studid, sum(pre) 'B4' , sum(post) 'After'
from bodpod
group by studid
having After > 0 and B4 > 0) data;更正:
SELECT t1.studid, t1.TestDate, t1.pre, t2.post, ROUND( (
( t2.post - t1.pre ) / t1.pre ) *100, 1 ) AS percentChange
FROM bodpod t1
join bodpod t2 on t1.studid = t2.studid
WHERE t1.ID2 = 'fall'
AND t1.studid != ''
and t2.pre=0
GROUP BY studid
HAVING COUNT( DISTINCT t1.ID1 ) >1
AND TestDate LIKE '%2013%'当我运行它(在MySQL工作台中)时,我得到:
studid TestDate pre post percentChange
6093191 8/12/2013 10:38 27.7 22.8 -17.7累计百分比(假定不需要加权):
SELECT ROUND( ( (sum(After) - sum(B4)) / sum(B4) ) *100, 1 ) AS percentChange from
(SELECT t1.studid, t1.TestDate, t1.pre as B4, t2.post as After
FROM bodpod t1
join bodpod t2 on t1.studid = t2.studid
WHERE t1.ID2 = 'fall'
AND t1.studid != ''
and t2.pre=0
GROUP BY studid
HAVING COUNT( DISTINCT t1.ID1 ) >1
AND TestDate LIKE '%2013%') scoreshttps://stackoverflow.com/questions/20482947
复制相似问题