日期:2014-05-18  浏览次数:20537 次

SQL group by 统计问题求助
学生每天竞技比赛,赢了得分,输了负分,0表示当天没参加比赛。


原表格:
日期 学号 姓名 成绩
2010/10/15 1 张三 857
2010/10/15 2 李四 -8
2010/10/15 3 王五 145
2010/10/16 1 张三 516
2010/10/16 2 李四 -28
2011/6/18 3 王五 32
2011/6/18 1 张三 58
2011/6/18 2 李四 0


希望求得:

学号 姓名 2010总成绩 2010最高分 2010/9/1-2010/10/16的最低分(a) 2011/1/1 - 2011/9/1的最高分(b) 分数差a-b 提高比例((a-b)/a) 时间1 时间2





时间1 = 2010/9/1-2010/10/16 时间2 = 2011/1/1 - 2011/9/1


感谢各位大神帮助!!!求具体代码,没搜到闷。

大家新春快乐!

------解决方案--------------------
select stuno as 学号,stuname as 姓名,[2010总成绩],[2010最高分],
A,B,(A-B) AS '分数差',(A-B)/A as '提高比例',
'2010/9/1-2010/10/16' as '时间1',
 '2011/1/1 - 2011/9/1' as '时间2'
from(
select *from
(select stuno,stuname ,
SUM(score) as '2010总成绩',MAX(score) as '2010最高分' 
from tbl
where YEAR([date])=2010
group by stuname,stuno)a
inner join
(select stuno as 学号,MIN(score) as 'A' from tbl
where [date] between '2010/9/1' and '2010/10/16'
group by stuno)b 
on a.stuno=b.学号
inner join
(select stuno as number,MAX(score) as 'B' from tbl
where [date] between '2011/1/1' and '2011/9/1'
group by stuno)c 
on a.stuno=c.number
)d

/*
你要的是这个结果??
学号 姓名 2010总成绩 2010最高分 A B 分数差 提高比例 时间1 时间2
1 张三 1373 857 516 58 458 0 2010/9/1-2010/10/16 2011/1/1 - 2011/9/1
2 李四 -36 -8 -28 0 -28 1 2010/9/1-2010/10/16 2011/1/1 - 2011/9/1
3 王五 145 145 145 32 113 0 2010/9/1-2010/10/16 2011/1/1 - 2011/9/1
*/