首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

数据统计处理的有关问题.多谢

2012-03-02 
数据统计处理的问题.谢谢.MSSQL 2005 有两个表分别是StudentIDStuNoNameGradeClass1800001陈明1A2800002张

数据统计处理的问题.谢谢.
MSSQL 2005 有两个表分别是
Student
IDStuNoNameGradeClass
1800001陈明1A
2800002张华2A
3800003李月3A
4800004黎顺1B
5800005许肖基2B
6800006肖晨咕3B
7800007杨晨明1A
8800008戴三2A
9800009黄英3A
10800010张三4A
11800011李四5A
12800012黄五4A
13800013陈七5A


Score
StuNoMark
8000013
80000277
80000392
80000447
80000582
80000624
8000077
80000894
80000972
80001073
8000116
80001278
80001396


求结果如下的SQL语句
标题GradeClassStuNoMark
1A8000013
1A8000077
班总分1ANULL10
级总分1NULLNULL57
1B80000447
班总分1BNULL47
2A80000277
2A80000894
班总分2ANULL171
级总分2NULLNULL253
2B80000582
班总分2BNULL82
3A80000392
3A80000972
班总分3ANULL164
级总分3NULLNULL188
3B80000624
班总分3BNULL24
4A80001073
4A80001278
班总分4ANULL151
级总分4NULLNULL151
5A8000116
5A80001396
班总分5ANULL102
级总分5NULLNULL102
总分NULLNULLNULL751


SQL脚本如下:

SQL code
--DROP TABLE Student;CREATE TABLE Student(ID INT IDENTITY(1, 1) PRIMARY KEY,StuNo INT UNIQUE,Name VARCHAR(128),Grade INT,Class VARCHAR(10));--DROP TABLE Score;CREATE TABLE Score(StuNo INT FOREIGN KEY REFERENCES Student(StuNo),Mark INT);INSERT INTO Student VALUES (800001, '陈明', 1, 'A');INSERT INTO Student VALUES (800002, '张华', 2, 'A');INSERT INTO Student VALUES (800003, '李月', 3, 'A');INSERT INTO Student VALUES (800004, '黎顺', 1, 'B');INSERT INTO Student VALUES (800005, '许肖基', 2, 'B');INSERT INTO Student VALUES (800006, '肖晨咕', 3, 'B');INSERT INTO Student VALUES (800007, '杨晨明', 1, 'A');INSERT INTO Student VALUES (800008, '戴三', 2, 'A');INSERT INTO Student VALUES (800009, '黄英', 3, 'A');INSERT INTO Student VALUES (800010, '张三', 4, 'A');INSERT INTO Student VALUES (800011, '李四', 5, 'A');INSERT INTO Student VALUES (800012, '黄五', 4, 'A');INSERT INTO Student VALUES (800013, '陈七', 5, 'A');/*BEGIN    DECLARE StuCur CURSOR FOR SELECT StuNo FROM Student;    DECLARE @StrBuffer AS VARCHAR(1024);    OPEN StuCur;    FETCH NEXT FROM StuCur INTO @StrBuffer;    WHILE @@FETCH_STATUS = 0    BEGIN        PRINT 'INSERT INTO Score VALUES(' + @StrBuffer + ', '         + CAST(CAST(RAND() * 100 AS INT) AS VARCHAR) + ')'        FETCH NEXT FROM StuCur INTO @StrBuffer;    END    DEALLOCATE StuCurEND*/INSERT INTO Score VALUES(800001, 53)INSERT INTO Score VALUES(800002, 77)INSERT INTO Score VALUES(800003, 92)INSERT INTO Score VALUES(800004, 47)INSERT INTO Score VALUES(800005, 82)INSERT INTO Score VALUES(800006, 24)INSERT INTO Score VALUES(800007, 73)INSERT INTO Score VALUES(800008, 94)INSERT INTO Score VALUES(800009, 72)INSERT INTO Score VALUES(800010, 73)INSERT INTO Score VALUES(800011, 63)INSERT INTO Score VALUES(800012, 78)INSERT INTO Score VALUES(800013, 96)




[解决办法]
SQL code
CREATE TABLE Student(ID INT IDENTITY(1, 1) PRIMARY KEY,StuNo INT UNIQUE,Name VARCHAR(128),Grade INT,Class VARCHAR(10))go--DROP TABLE Score;CREATE TABLE Score(StuNo INT FOREIGN KEY REFERENCES Student(StuNo),Mark INT)INSERT INTO Student VALUES (800001, '陈明', 1, 'A');INSERT INTO Student VALUES (800002, '张华', 2, 'A');INSERT INTO Student VALUES (800003, '李月', 3, 'A');INSERT INTO Student VALUES (800004, '黎顺', 1, 'B');INSERT INTO Student VALUES (800005, '许肖基', 2, 'B');INSERT INTO Student VALUES (800006, '肖晨咕', 3, 'B');INSERT INTO Student VALUES (800007, '杨晨明', 1, 'A');INSERT INTO Student VALUES (800008, '戴三', 2, 'A');INSERT INTO Student VALUES (800009, '黄英', 3, 'A');INSERT INTO Student VALUES (800010, '张三', 4, 'A');INSERT INTO Student VALUES (800011, '李四', 5, 'A');INSERT INTO Student VALUES (800012, '黄五', 4, 'A');INSERT INTO Student VALUES (800013, '陈七', 5, 'A');INSERT INTO Score VALUES(800001, 53)INSERT INTO Score VALUES(800002, 77)INSERT INTO Score VALUES(800003, 92)INSERT INTO Score VALUES(800004, 47)INSERT INTO Score VALUES(800005, 82)INSERT INTO Score VALUES(800006, 24)INSERT INTO Score VALUES(800007, 73)INSERT INTO Score VALUES(800008, 94)INSERT INTO Score VALUES(800009, 72)INSERT INTO Score VALUES(800010, 73)INSERT INTO Score VALUES(800011, 63)INSERT INTO Score VALUES(800012, 78)INSERT INTO Score VALUES(800013, 96)goselect CASE WHEN (GROUPING(a.Grade) = 1) THEN '总分'            ELSE ISNULL(cast(a.Grade as varchar), 'UNKNOWN')       END AS 总分,  --'总分'),       a.Class,       a.StuNo,       sum(b.mark) as markfrom Student aleft join Score b on a.stuno = b.stunogroup by a.grade,a.class,a.stuno with rollup drop table Score,Student/*总分                             Class      StuNo       mark        ------------------------------ ---------- ----------- ----------- 1                              A          800001      531                              A          800007      731                              A          NULL        1261                              B          800004      471                              B          NULL        471                              NULL       NULL        1732                              A          800002      772                              A          800008      942                              A          NULL        1712                              B          800005      822                              B          NULL        822                              NULL       NULL        2533                              A          800003      923                              A          800009      723                              A          NULL        1643                              B          800006      243                              B          NULL        243                              NULL       NULL        1884                              A          800010      734                              A          800012      784                              A          NULL        1514                              NULL       NULL        1515                              A          800011      635                              A          800013      965                              A          NULL        1595                              NULL       NULL        159总分                             NULL       NULL        924(所影响的行数为 27 行)*/ 


[解决办法]

SQL code
--作出一可正确排序的表select case when id=0 then '' when id=1 then '班总分' else '级总分' end 标题,    grade,case when class='Z' then null else class end class1,stuno,markfrom ( select 0 id,a.grade,a.class,a.stuno,b.markfrom student a,score bwhere a.stuno=b.stunounion allselect 1 id,a.grade,a.class,null studno,sum(b.mark) markfrom student a,score bwhere a.stuno=b.stunogroup by a.grade,a.classunion allselect 2 id,a.grade,'Z' class,null studno,sum(b.mark) markfrom student a,score bwhere a.stuno=b.stunogroup by a.grade ) aorder by grade,class,id 

热点排行