一道SQL统计试题

根据上图A表和B表,按照年份和地区生成1至12个月的数据,结果如下:

方法一:

select YEAR,AreaName,
MAX(case Month when '1' then Money else 0 end) as [1月],
MAX(case Month when '2' then Money else 0 end) as [2月],
MAX(case Month when '3' then Money else 0 end) as [3月],
MAX(case Month when '4' then Money else 0 end) as [4月],
MAX(case Month when '5' then Money else 0 end) as [5月],
MAX(case Month when '6' then Money else 0 end) as [6月],
MAX(case Month when '7' then Money else 0 end) as [7月],
MAX(case Month when '8' then Money else 0 end) as [8月],
MAX(case Month when '9' then Money else 0 end) as [9月],
MAX(case Month when '10' then Money else 0 end) as [10月],
MAX(case Month when '11' then Money else 0 end) as [11月],
MAX(case Month when '12' then Money else 0 end) as [12月]
from 
(
select B.AreaName, 
SUM(Money) as Money,YEAR(CreateOn) Year,Month(CreateOn) Month
from A left join B on A.AreaId=B.AreaId
group by AreaName, YEAR(CreateOn),Month(CreateOn)
) A group by Year,AreaName
order by Year,AreaName
方法二:
select Year,AreaName,
ISNULL([1],0) as [1月],ISNULL([2],0) as [2月],ISNULL([3],0) as [3月],ISNULL([4],0) as [4月],
ISNULL([5],0) as [5月],ISNULL([6],0) as [6月],ISNULL([7],0) as [7月],ISNULL([8],0) as [8月],
ISNULL([9],0) as [9月],ISNULL([10],0) as [10月],ISNULL([11],0) as [11月],ISNULL([12],0) as [12月]
from 
(
select B.AreaName, 
SUM(Money) as Money,YEAR(CreateOn) Year,Month(CreateOn) Month
from A left join B on A.AreaId=B.AreaId
group by AreaName, YEAR(CreateOn),Month(CreateOn)
)
A 
pivot
(
	sum(money)
	for Month in
	([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]) 
) as pvt
order by Year,AreaName
方法三:

--先创建表变量,并插入月份数据
declare @tb table(Month varchar(2)) 
insert @tb select 1 union all select 2 union all select 3 union all select 4 union all
select 5 union all select 6 union all select 7 union all select 8 union all
select 9 union all select 10 union all select 11 union all select 12

declare @sql varchar(8000)
set @sql = 'select Year,AreaName '
select @sql = @sql + ' , max(case Month when ''' + convert(varchar(10),Month) + ''' then Money else 0 end) [' + convert(varchar(10),Month) + '月]'
from 
(
     select Month from @tb
    --select distinct Month(CreateOn) Month from A 
 ) as a
set @sql = @sql + '  from 
(
  select B.AreaName, 
  SUM(Money) as Money,YEAR(CreateOn) Year,Month(CreateOn) Month
  from A left join B on A.AreaId=B.AreaId
  group by AreaName, YEAR(CreateOn),Month(CreateOn)
)
tb group by Year,AreaName'
exec(@sql) 
好的,以下是按照您要求的一道一道题目的答案: ### 考试说明: 1. **创建文件夹**: 创建一个以姓名+学号命名的文件夹。 2. **保存数据库文件**: 将创建的数据库文件保存在该文件夹中。 3. **上机操作考试**: - 每道试题都以SQL语句的方式完成。 - 每道试题SQL语句保存在以题号命名的`.sql`文件中,保存在上述创建的文件夹中。 4. **考试结束**: - 检查所有数据文件。 - 压缩考试文件夹。 - 发送到课堂派,最终时间不得超过16:10。 ### 一、数据库操作 1. **创建数据库**: ```sql CREATE DATABASE Test; ``` 2. **重命名数据库**: ```sql ALTER DATABASE Test MODIFY NAME = [Test+学号]; ``` ### 二、表操作 1. **创建表**: - **student表**: ```sql CREATE TABLE student ( s_id CHAR(8) NOT NULL, s_name CHAR(6), sex CHAR(2), birthday DATETIME, major CHAR(20), PRIMARY KEY (s_id) ); ``` - **score表**: ```sql CREATE TABLE score ( s_id CHAR(8) NOT NULL, c_id CHAR(3) NOT NULL, score DECIMAL(4, 1), PRIMARY KEY (s_id, c_id), FOREIGN KEY (s_id) REFERENCES student(s_id), FOREIGN KEY (c_id) REFERENCES course(c_id), CHECK (score BETWEEN 0 AND 100) ); ``` - **course表**: ```sql CREATE TABLE course ( c_id CHAR(3) NOT NULL, c_name CHAR(20), credit INT, PRIMARY KEY (c_id) ); ``` 2. **设置主键和外键**: - **student表**: ```sql ALTER TABLE student ADD CONSTRAINT PK_student PRIMARY KEY (s_id); ``` - **score表**: ```sql ALTER TABLE score ADD CONSTRAINT PK_score PRIMARY KEY (s_id, c_id); ALTER TABLE score ADD CONSTRAINT FK_score_student FOREIGN KEY (s_id) REFERENCES student(s_id); ALTER TABLE score ADD CONSTRAINT FK_score_course FOREIGN KEY (c_id) REFERENCES course(c_id); ALTER TABLE score ADD CONSTRAINT CK_score CHECK (score BETWEEN 0 AND 100); ``` - **course表**: ```sql ALTER TABLE course ADD CONSTRAINT PK_course PRIMARY KEY (c_id); ``` 3. **设置默认值和检查约束**: - **student表**: ```sql ALTER TABLE student ADD CONSTRAINT DF_major DEFAULT '计算机网维护' FOR major; ``` 4. **插入记录**: - **student表**: ```sql INSERT INTO student (s_id, s_name, sex, birthday, major) VALUES ('110101', '张扬', '男', '1992-01-12', '计算机'); INSERT INTO student (s_id, s_name, sex, birthday, major) VALUES ('110102', '张阳', '男', '1992-01-13', '网络'); ``` - **course表**: ```sql INSERT INTO course (c_id, c_name, credit) VALUES ('01', '计算机网络', 2); INSERT INTO course (c_id, c_name, credit) VALUES ('02', 'C语言程序设计', 2); ``` - **score表**: ```sql INSERT INTO score (s_id, c_id, score) VALUES ('110101', '01', 75.0); INSERT INTO score (s_id, c_id, score) VALUES ('110102', '02', 76.0); ``` ### 三、数据操纵 1. **查询性别为“男”的学生记录**: ```sql SELECT s_name, birthday, major FROM student WHERE sex = '男'; ``` 2. **查询课程名包含“计算机”的课程**: ```sql SELECT * FROM course WHERE c_name LIKE '%计算机%'; ``` 3. **查询课程编号为“001”的课程成绩前三名学生**: ```sql SELECT TOP 3 s_id, score FROM score WHERE c_id = '001' ORDER BY score DESC; ``` 4. **查询课程编号为“001”且成绩在[80, 90]之间的学生信息**: ```sql SELECT s.s_name, c.c_name, sc.score FROM student s JOIN score sc ON s.s_id = sc.s_id JOIN course c ON sc.c_id = c.c_id WHERE sc.c_id = '001' AND sc.score BETWEEN 80 AND 90; ``` 5. **查询专业为“计算机软件”、“电子商务”和“多媒体技术”的学生信息**: ```sql SELECT * FROM student WHERE major IN ('计算机软件', '电子商务', '多媒体技术'); ``` 6. **统计“计算机应用基础”课程的平均分**: ```sql SELECT AVG(score) AS average_score FROM score JOIN course ON score.c_id = course.c_id WHERE course.c_name = '计算机应用基础'; ``` 7. **查找各课程的修课人数**: ```sql SELECT c_id, COUNT(*) AS num_students FROM score GROUP BY c_id; ``` ### 四、视图 1. **查询课程编号为“001”的所有学生的分数及最高分、最低分和平均分**: ```sql CREATE VIEW Course001_Scores AS SELECT s_id, score, MAX(score) OVER () AS max_score, MIN(score) OVER () AS min_score, AVG(score) OVER () AS avg_score FROM score WHERE c_id = '001'; ``` 2. **查询所有女生的“计算机应用基础”这课的成绩**: ```sql CREATE VIEW Female_ComputerAppScores AS SELECT s.s_name, c.c_name, sc.score FROM student s JOIN score sc ON s.s_id = sc.s_id JOIN course c ON sc.c_id = c.c_id WHERE s.sex = '女' AND c.c_name = '计算机应用基础'; ``` 3. **查询课程编号为“001”且成绩高于平均分的学生信息**: ```sql CREATE VIEW HigherThanAvg_Scores AS SELECT s.s_name, c.c_name, sc.score FROM student s JOIN score sc ON s.s_id = sc.s_id JOIN course c ON sc.c_id = c.c_id WHERE sc.c_id = '001' AND sc.score > (SELECT AVG(score) FROM score WHERE c_id = '001'); ``` 4. **查询高于各课程平均分的学生信息**: ```sql CREATE VIEW HigherThanCourseAvg_Scores AS SELECT s.s_name, c.c_name, sc.score FROM student s JOIN score sc ON s.s_id = sc.s_id JOIN course c ON sc.c_id = c.c_id WHERE sc.score > (SELECT AVG(score) FROM score WHERE c_id = sc.c_id); ``` 5. **创建视图“学生成绩”**: ```sql CREATE VIEW StudentGrades AS SELECT s.s_id, s.s_name, c.c_name, sc.score, s.major FROM student s JOIN score sc ON s.s_id = sc.s_id JOIN course c ON sc.c_id = c.c_id WHERE s.major = '计算机网络维护'; ``` ### 五、索引 1. **在“student表”上基于“s_name”创建非聚集索引**: ```sql CREATE NONCLUSTERED INDEX IDX_Name ON student (s_name); ``` 2. **在“score表”上分别基于“s_id”、“c_id”创建非聚集索引**: ```sql CREATE NONCLUSTERED INDEX IDX_s_id ON score (s_id); CREATE NONCLUSTERED INDEX IDX_c_id ON score (c_id); ``` ### 六、存储过程 1. **创建存储过程,返回某同学的最高成绩、最低成绩和平均成绩**: ```sql CREATE PROCEDURE GetStudentGrades @student_id CHAR(8) AS BEGIN SELECT MAX(score) AS highest_score, MIN(score) AS lowest_score, AVG(score) AS average_score FROM score WHERE s_id = @student_id; END; ``` ### 七、备份 1. **对数据库进行完整备份**: ```sql BACKUP DATABASE [Test+学号] TO DISK = '[路径]\[学号+姓名].bak'; ``` - 注意:备份名称为自己的学号+姓名.sql(如'200808101李四.sql')。 - 可在命令提示符下完成,把代码写到Workbench的SQL文件里进行保存。 2. **数据库分离**: ```sql USE master; GO EXEC sp_detach_db @dbname = N'Test+学号'; GO ``` - 对数据库进行分离,将里边的文件检查好,整个文件夹压缩,16点10分之前上传至课堂派。 希望这些答案能帮助您顺利完成考试!如果有任何疑问,请随时联系我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值