关于数据库统计查询的sql语句

在 网上看到了很多提问关于统计查询sql的写法,   其实问题的本质都一样, 能解决一个,就能解决所有的(我大胆的这样想.估计不完全正确).  这些问题的描述如下:
有这样一个表:

StudetNum
ID StudetNo Class numeric
1 1 Yw 80
2 1 SHUXUE 90
3 1 English 60
4 2 Yw 60
5 2 SHUXUE 30
6 2 English 60
7 3 Yw 80
8 3 SHUXUE 40
9 3 English 40
10 4 Yw 20
11 4 SHUXUE 140
12 5 English 60
13 6 English 50
14 7 Yw 40


我对这个表作简单的介绍: 这个表存储学生的成绩. id是这个表的关键字段, studetno(我知道student是这样写的, 嘿嘿) 代表学生的学号, class是课程.  numeric是成绩.

当然这个表是不够合理的, 暂且不讨论这个问题.等我下期再研究这个问题.

如果要得到下面的查询结果 ,该怎么作呢?
tongsuchaxun
studetno Yw English SHUXUE Total Avg
1 80 60 90 230 76.6666666666667
2 60 60 30 150 50
3 80 40 40 160 53.3333333333333
4 20
140 160 80
5
60
60 60
6
50
50 50
7 40

40 40



目前大家可以清楚的看到这张学生课程成绩表中课程只有3种,  假设在应用程序中学生的课程不变, 那么如下sql将很简单的解决了问题:

select studetno, (select numeric from studetnum t1 where class= 'Yw' and t.studetno=t1.studetno) as Yw,
                 (select numeric from studetnum t2 where class= 'English' and t.studetno=t2.studetno) as English,
                 (select numeric from studetnum t3 where class= 'SHUXUE' and t.studetno=t3.studetno) as SHUXUE,
                 (select sum(numeric) from studetnum t4 where  t.studetno=t4.studetno) as Total,
                 (select avg(numeric) from studetnum t5 where  t.studetno=t5.studetno) as  Avg     from StudetNum t group by studetno

还有一种方法是把select子查询改成 case when 子句。 


但是如果学生课程是可变的, 我需要得到这样的查询表格:
studetno        class1   class2  class3  ....   classN   sum   avg
1                      68          96          80   ....      87         *        *
           .....................
           .....................


那么该如何写一条具有伸缩弹性的sql语句呢??   一条不行??  那么就用存储过程,
可是假如数据库是access 的,你还会用存储过程嘛?   当然,你不会说一定要在程序逻辑中实现吧? 
 

posted @ 2005-07-29 12:36  JustLive  阅读(1044)  评论(0编辑  收藏  举报