数据库应用与开发教程(ADO.NET+SQL Server 单元05 统计与报表

上传人:E**** 文档编号:89425382 上传时间:2019-05-25 格式:PPT 页数:43 大小:998.50KB
返回 下载 相关 举报
数据库应用与开发教程(ADO.NET+SQL Server 单元05 统计与报表_第1页
第1页 / 共43页
数据库应用与开发教程(ADO.NET+SQL Server 单元05 统计与报表_第2页
第2页 / 共43页
数据库应用与开发教程(ADO.NET+SQL Server 单元05 统计与报表_第3页
第3页 / 共43页
数据库应用与开发教程(ADO.NET+SQL Server 单元05 统计与报表_第4页
第4页 / 共43页
数据库应用与开发教程(ADO.NET+SQL Server 单元05 统计与报表_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《数据库应用与开发教程(ADO.NET+SQL Server 单元05 统计与报表》由会员分享,可在线阅读,更多相关《数据库应用与开发教程(ADO.NET+SQL Server 单元05 统计与报表(43页珍藏版)》请在金锄头文库上搜索。

1、单元五,统计与报表,回顾,代码改错: SELECT StudentNo, StudentName FROM Student ORDER BY StudentNo WHERE SEX = 0 查询全部的男同学的SQL语句怎么写? 查询班上考试成绩前三名的成绩的SQL语句怎么写? 如何使用SQL语句得到50天以前的日期信息?,本单元任务,任务一 完成“学生成绩表” 任务二 完成“学生信息表” 任务三 完成“学院学生数汇总表”,新增管理员,新增教师,新增学生,本单元目标,使用聚合函数进行统计分析 使用分组查询 使用内联接将多表进行联接 使用外联接将多表进行联接 理解交叉数据报表及其处理示例 创建视图

2、 使用报表向导设计水晶报表,任务一 完成“学生成绩表”,任务描述:,任务分析:,模块功能:打印学生成绩表。 输入项目:在窗体中选择班级、课程信息,单击【确定】按钮. 输出项目:使用水晶报表列表显示学生的成绩信息,包括:学号、姓名、期末成绩、平时成绩、总评成绩等。,1成绩信息中只有课程号、学号;姓名存放于学生信息表中,因此,需要将两个表连接。 2学生成绩表的表格格式为“列表”形式。,1.多表连接查询,若一个查询同时涉及两个以上的表,则称之为连接查询。 联接可分为内联接、外联接和交叉联接等类型。,问题: score表存储了成绩信息信息,但只存储了学号,而无学生姓名; 系统要求显示学生姓名,该学生姓

3、名存贮在student表中; 如何同时从这两个表中取得数据?,内联结,猜一猜:这样写,返回的查询结果是一样的吗? SELECT S.StudentNO,StudentName , score1 期末成绩, score2 平时成绩, score3 总评成绩 FROM Student INNER JOIN Score ON Student.StudentNO= Score.StudentNO,SELECT student.StudentNO, StudentName, score1 期末成绩, score2 平时成绩, score3 总评成绩 FROM Student,Score WHERE St

4、udent.StudentNO=Score.StudentNO,内联结,【例5-1】查询学生学号、姓名和成绩 。,外联结-左连接,在外连接中参与联接的表有言主表和从表之分,SELECT Student.StudentNO,StudentName , score1 期末成绩, score2 平时成绩, score3 总评成绩 FROM Student Left JOIN Score ON Student.StudentNO= Score.StudentNO,SELECT student.StudentNO, StudentName, score1 期末成绩, score2 平时成绩, score

5、3 总评成绩 FROM Student,Score WHERE Student.StudentNO *= Score.StudentNO,左连接范例,查询学生学号、姓名和成绩 。 如学生未参加任何考试,则显示成绩为空。,右连接,右外连接与左外连接查询类似,想一想:将上面的左连接改写成这样,返回的查询结果是一样的吗? SELECT S.StudentNO,StudentName , score1 期末成绩, score2 平时成绩, score3 总评成绩 FROM Score Right JOIN Student ON Student.StudentNO= Score.StudentNO 想一

6、想:将另一种方法如何改写?,什么是视图,视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上 视图中并不存放数据,而是存放在视图所引用的原始表(基表)中 同一张原始表,根据不同用户的不同需求,可以创建不同的视图,视图的优点,视图的用途 筛选表中的行 防止未经许可的用户访问敏感数据 降低数据库的复杂程度 将多个物理数据库抽象为一个逻辑数据库,如何创建视图,演示使用企业管理器创建视图,T-SQL创建视图,使用T-SQL语句创建视图的语法,CREATE VIEW view_name AS ,T-SQL创建视图范例,【例5-6】使用T-SQL语句在数据库My

7、School中创建上例vw_ Score视图。,USE MySchool GO /*-检查是否存在:视图存放在系统表sysobjects中-*/ IF EXISTS(SELECT * FROM sysobjects WHERE name=vw_Score) DROP VIEW vw_Score GO create view vw_score as SELECT ID, Student.StudentNO, StudentName, Subject.SubjectID, SubjectName, score.SCORE1 AS 期末成绩, score.SCORE2 AS 平时 成绩, score

8、.SCORE3 AS 总评成绩 FROM score INNER JOIN Student ON score.STUDENTNO = Student.StudentNO INNER JOIN Subject ON score.SUBJECTID = Subject.SubjectID GO SELECT * FROM vw_Score -访问视图,检测是否存在,创建视图,使用视图,删除视图,水晶报表,水晶报表的实现 水晶报表(Crystal Reports)是Business Objects公司出品报表分析与生成软件,最新版为11版,该版又分为三个版本:专业版、开发版和服务器版。 水晶报表的执

9、行模式 Pull(拉)模式 Push(推)模式,任务实施,1生成数据集 2制作水晶报表 3制作报表窗体界面 4编写代码,教师实现,学生模仿,任务二 完成“学生信息表 ”,任务描述:,任务分析:,模块功能:打印学生名册。 输入项目:无. 输出项目:使用水晶报表列表显示学生名册,包括:学号、姓名、专业、电话等信息。 测试要点:是否能正确打印学生名册信息。,学生信息表的表格格式为“列表”形式。,水晶报表的模式,Pull模式 驱动程序将连接到数据库并根据需要将数据“拉”进来。 使用这种模型时,与数据库的连接和为了获取数据而执行的 SQL 命令都同时由 Crystal Reports 本身处理,不需要开

10、发人员编写代码。 如果在运行时无须编写任何特殊代码,则使用拉模型。,水晶报表的模式,Push模式 需要开发人员编写代码以连接到数据库,执行 SQL 命令以创建与报表中的字段匹配的记录集或数据集,并且将该对象传递给报表。 该方法使您可以将连接共享置入应用程序中,并在 Crystal Reports 收到数据之前先将数据筛选出来。,报表设计,报表页眉,页眉,详细,报表页脚,页脚,Pull方式的关键设置,任务实施,PULL模式实现“学生信息表”,教师实现,学生模仿,任务三 完成“学院学生数汇总表”,任务描述:,任务分析:,模块功能:按照各学院统计现有学生人数,打印“学院学生数汇总表”。 输入项目:无

11、. 输出项目:使用水晶报表列表显示学院名、学生数;另外要求使用棒图对比分析各学院的学生数。 测试要点:是否能正确统计学生数,能否棒图显示数据。,1各学院最新学生人数,要使用统计函数统计。 2报表显示使用PUSH方式。 3棒图显示需要使用水晶报表的“图形专家”。,统计函数,常用统计函数: Sum() 合计值 Avg() 平均值 min() 最小值 max() 最大值 count() 行数,统计函数,SUM,SELECT SUM(Score1) AS 期末成绩总分 FROM Score where subjectID=1,AVG,SELECT AVG(Score1) AS 平均成绩 FROM Sc

12、ore where subjectID=1,MAX、MIN,SELECT 最高分=MAX(Score1), 最低分=MIN (Score1) FROM Score,COUNT,SELECT Count(*) AS 及格人数 FROM Score WHERE Score1=60 and subjectID=1,统计函数,想一想:下面的代码正确吗?,代码错误,SELECT SUM(Score1) AS 期末成绩总分 , score1 FROM Score where subjectID=1,问题,如果不是统计所有人所有课程的总成绩 而是想求每门课的平均绩或者某个人的所有课的总成绩 怎么办?,分组汇

13、总,第一门课8个成绩取平均值,第二门课8个成绩取平均值,第三门课4个成绩取平均值,分组查询GROUP BY,SELECT SubjectID, AVG(Score1) AS 期末平均成绩, AVG(Score2) AS 平时平均分,AVG(Score3) AS 总评平均分 FROM Score GROUP BY SubjectID,多列分组,【例5-12】查询每个班的男女生总数。,将班级号、性别组合起来相同的行数加起来,多列分组,select classid 班级号, sex 性别, count(*) 人数 from student group by classid, sex order by

14、 classid, sex,注意事项,在SELECT子句的字段列表中,除聚合函数外,其他所出现的字段一定要ROUP BY子句中有定义才行。 SELECT子句的字段列表中不一定要有聚合函数,但至少要有ROUP BY子句列表。,HAVING-问题,在以上统计期末平均成绩的基础上, 如果想查平均成绩低于60的课程,怎么办,HAVING,SELECT SubjectID, AVG(Score1) AS 期末平均成绩, AVG(Score2) AS 平时平均分,AVG(Score3) AS 总评平均分 FROM Score GROUP BY SubjectID HAVING AVG(Score1) 60

15、,SELECT SubjectID, AVG(Score1) AS 期末平均成绩, AVG(Score2) AS 平时平均分,AVG(Score3) AS 总评平均分 FROM Score GROUP BY SubjectID,任务实施,1创建视图 2创建数据集 3创建报表 4在窗体中添加CrystalReportViewer控件,教师实现,学生模仿,创建视图,关键代码回顾,Create VIEW v_stucnt AS SELECT Department.name 学院名, COUNT(Student.StudentID) 学生人数 FROM Class JOIN Specialty ON

16、Class.SpecialtyID = Specialty.id JOIN Student ON Class.ClassID = Student.ClassID RIGHT JOIN Department ON Specialty.departmentID = Department.id GROUP BY Department.name GO,在报表中使用图表,右击,选择【插入(I)】【图表(A)】,选择棒图。在“数据”选项卡中,如图5-43所示,选择“对于每个记录”,设置横坐标为“学院名”,纵坐标为“学生人数”。 在“文本”选项卡中,如图5-44所示,输入标题等信息。,代码分析,关键代码回顾,private void RptStuCntFrm_Load(object sender, EventArgs e) SqlDataAdapter da = new SqlDataAdap

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号