一个贴子在SQL版没得到解答,在此向各位达人请教
先上测试数据表if object_id('Students') is not null
drop table Students --学生表
create table Students(id int identity(1,1),name varchar(10),Department varchar(30))
insert into Students(name,Department) values('张三','计算机系')
insert into Students(name,Department) values('李四','外语系')
insert into Students(name,Department) values('王二','计算机系')
insert into Students(name,Department) values('赵五','数学系')if object_id('Score') is not null
drop table Score --学生成绩表
create table Score(id int identity(1,1),name varchar(10),Course varchar(30),Score int)
insert into Score (name,Course,Score) values('张三','数学',90)
insert into Score (name,Course,Score) values('张三','C语言',70)
insert into Score (name,Course,Score) values('张三','英语',60)
insert into Score (name,Course,Score) values('李四','语文',78)
insert into Score (name,Course,Score) values('李四','英语',81)
insert into Score (name,Course,Score) values('李四','政治',49)
insert into Score (name,Course,Score) values('李四','数学',89)
insert into Score (name,Course,Score) values('赵五','数学',100)
insert into Score (name,Course,Score) values('赵五','政治',54)
insert into Score (name,Course,Score) values('王二','数学',39)if object_id('Course') is not null
drop table Course --必修课程表
create table Course(id int identity(1,1),Department varchar(30),Course varchar(30))
insert into Course (Department,Course) values('计算机系','数学')
insert into Course (Department,Course) values('计算机系','C语言')
insert into Course (Department,Course) values('计算机系','英语')
insert into Course (Department,Course) values('外语系','语文')
insert into Course (Department,Course) values('外语系','英语')
insert into Course (Department,Course) values('外语系','政治')
insert into Course (Department,Course) values('数学系','语文')
insert into Course (Department,Course) values('数学系','数学')
insert into Course (Department,Course) values('数学系','政治')要求:要求:从学生表取出学生信息,然后在学生成绩表中查这些学生的成绩记录,把这些记录与专业必考课程中的课程对比(根据学生专业,即系名)如果必考课程里规定的(该专业)课程在该生成绩表里没有记录,表明该生这门课程缺考;如果学生成绩小于60分,表明学生的这门课程不及格。最后的结果集要求每个学生一条记录,显示缺考课程及不及格课程结果要求如下方式显示
先上测试数据表if object_id('Students') is not null
drop table Students --学生表
create table Students(id int identity(1,1),name varchar(10),Department varchar(30))
insert into Students(name,Department) values('张三','计算机系')
insert into Students(name,Department) values('李四','外语系')
insert into Students(name,Department) values('王二','计算机系')
insert into Students(name,Department) values('赵五','数学系')if object_id('Score') is not null
drop table Score --学生成绩表
create table Score(id int identity(1,1),name varchar(10),Course varchar(30),Score int)
insert into Score (name,Course,Score) values('张三','数学',90)
insert into Score (name,Course,Score) values('张三','C语言',70)
insert into Score (name,Course,Score) values('张三','英语',60)
insert into Score (name,Course,Score) values('李四','语文',78)
insert into Score (name,Course,Score) values('李四','英语',81)
insert into Score (name,Course,Score) values('李四','政治',49)
insert into Score (name,Course,Score) values('李四','数学',89)
insert into Score (name,Course,Score) values('赵五','数学',100)
insert into Score (name,Course,Score) values('赵五','政治',54)
insert into Score (name,Course,Score) values('王二','数学',39)if object_id('Course') is not null
drop table Course --必修课程表
create table Course(id int identity(1,1),Department varchar(30),Course varchar(30))
insert into Course (Department,Course) values('计算机系','数学')
insert into Course (Department,Course) values('计算机系','C语言')
insert into Course (Department,Course) values('计算机系','英语')
insert into Course (Department,Course) values('外语系','语文')
insert into Course (Department,Course) values('外语系','英语')
insert into Course (Department,Course) values('外语系','政治')
insert into Course (Department,Course) values('数学系','语文')
insert into Course (Department,Course) values('数学系','数学')
insert into Course (Department,Course) values('数学系','政治')要求:要求:从学生表取出学生信息,然后在学生成绩表中查这些学生的成绩记录,把这些记录与专业必考课程中的课程对比(根据学生专业,即系名)如果必考课程里规定的(该专业)课程在该生成绩表里没有记录,表明该生这门课程缺考;如果学生成绩小于60分,表明学生的这门课程不及格。最后的结果集要求每个学生一条记录,显示缺考课程及不及格课程结果要求如下方式显示
解决方案 »
- web service方法中只能使用拼接???【声明:技术题目,帮顶学习回答无分,举例酌情多给分】
- 关于从数据库读取图片问题,请高手指教!
- 在JavaScript中,如何对TextBox的值进行修改?
- 关于Form验证的问题,我已经在web.config中配置了<authentication mode="Forms">,为什么不执行from验证啊?????( 急,在线等)
- 公式计算速度很慢怎么解决呢 ?第二贴了,帮帮忙
- 我写的程序被杀毒软件说是病毒怎么办啊。
- 刚设计了一个首页,大家评评,给点改进意见,来者有分!
- 各位大虾帮帮小弟,.net安装的问题
- 请教如何使用WCF
- 数据库(如果多个客户端同时更新数据库,怎么防止冲突呢?)
- 服务端和客户端脚本问题
- 公司想开发使用密码输入器(硬件)输入密码的web应用程序 请问有人做过吗
不知道你要的这个结果集是用来在list页面中显示,还是作为报表导出。如果是list显示的话,那么学生数据应该还是比较多的,所以就需要用到分页了,而分页的话,就只需要组合出某几条、十几条的数据即可。如果是这种情况,可以在存储过程中利用临时表去把数据组合出来。
简单讲就是:
1)建立临时表(StuName, PassCourse, UnpassCourse, Status)
2)插入要组合数据的学生
3)以此表为基准,循环遍历选课信息,然后再找该课程的成绩,然后将具体的结果插入/更新到PassCourse,UnpassCourse, Status字段中
4)返回此表的数据
5)清空/删除该临时表
如果是导出报表的话,面对大量的数据,这个方法也不错。当然非要用纯sql实现,我相信可以做到,但是效率未必就好。有那么句话:解决问题的方法可能只有一种,但是办法却可以有很多。
你做的用存储过程插入临时表,不知这样做的效率怎么样!
SELECT t1.name,t1.Department,t2.Course,t3.Score
,CASE WHEN Score IS NULL THEN 'QK'
WHEN Score < 60 THEN 'BJG' END AS Status
FROM Students t1
LEFT JOIN Course t2
ON t1.Department = t2.Department
LEFT JOIN Score t3
ON t1.name = t3.name
AND t2.Course = t3.Coursename Department Course Score Status
---------- ------------------------------ ------------------------------ ----------- ------
张三 计算机系 数学 90 NULL
张三 计算机系 C语言 70 NULL
张三 计算机系 英语 60 NULL
李四 外语系 语文 78 NULL
李四 外语系 英语 81 NULL
李四 外语系 政治 49 BJG
王二 计算机系 数学 39 BJG
王二 计算机系 C语言 NULL QK
王二 计算机系 英语 NULL QK
赵五 数学系 语文 NULL QK
赵五 数学系 数学 100 NULL
赵五 数学系 政治 54 BJG(12 row(s) affected)
至于做成什么格式报表,怎么显示,还是别把这样的工作交给SQL做
物尽其用,格式问题在前台很好解决,SQL只提供原始数据比较好
if object_id('Students') is not null
drop table Students --学生表
create table Students(id int identity(1,1),name varchar(10),Department varchar(30))
insert into Students(name,Department) values('张三','计算机系')
insert into Students(name,Department) values('李四','外语系')
insert into Students(name,Department) values('王二','计算机系')
insert into Students(name,Department) values('赵五','数学系')if object_id('Score') is not null
drop table Score --学生成绩表
create table Score(id int identity(1,1),name varchar(10),Course varchar(30),Score int)
insert into Score (name,Course,Score) values('张三','数学',90)
insert into Score (name,Course,Score) values('张三','C语言',70)
insert into Score (name,Course,Score) values('张三','英语',60)
insert into Score (name,Course,Score) values('李四','语文',78)
insert into Score (name,Course,Score) values('李四','英语',81)
insert into Score (name,Course,Score) values('李四','政治',49)
insert into Score (name,Course,Score) values('李四','数学',89)
insert into Score (name,Course,Score) values('赵五','数学',100)
insert into Score (name,Course,Score) values('赵五','政治',54)
insert into Score (name,Course,Score) values('王二','数学',39)if object_id('Course') is not null
drop table Course --必修课程表
create table Course(id int identity(1,1),Department varchar(30),Course varchar(30))
insert into Course (Department,Course) values('计算机系','数学')
insert into Course (Department,Course) values('计算机系','C语言')
insert into Course (Department,Course) values('计算机系','英语')
insert into Course (Department,Course) values('外语系','语文')
insert into Course (Department,Course) values('外语系','英语')
insert into Course (Department,Course) values('外语系','政治')
insert into Course (Department,Course) values('数学系','语文')
insert into Course (Department,Course) values('数学系','数学')
insert into Course (Department,Course) values('数学系','政治')--查询课程状态并插入临时表
if object_id('[tb]') is not null drop table [tb]
go
SELECT t1.Name,t1.Department,t2.Course,SUM(t3.Score) Score
,CASE WHEN sum(t3.Score) IS NULL THEN '缺考'
WHEN sum(t3.Score) < 60 THEN '不及格'
END AS Status into tb
FROM Students t1
LEFT JOIN Course t2
ON t1.Department = t2.Department
LEFT JOIN Score t3
ON t1.name = t3.name
AND t2.Course = t3.Course
GROUP BY t1.name,t1.Department,t2.Courseselect * from tb--创建条件行拼接函数
if object_id('[f_str]') is not null drop FUNCTION [f_str]
go
CREATE FUNCTION dbo.f_str(@name varchar(10),@flag varchar(10) = '缺考')
RETURNS varchar(8000)
AS
BEGIN
DECLARE @s varchar(8000)
if (@flag = '缺考')
begin
SELECT @s = isnull(@s + ',','') + Course FROM tb WHERE name=@name and Score is null
RETURN isnull(@s ,'')
end
else if (@flag = '不及格')
begin
SELECT @s = isnull(@s + ',','') + Course FROM tb WHERE name=@name and Score < 60
RETURN isnull(@s ,'')
end
else if (@flag = '正常')
begin
SELECT @s = isnull(@s + ',','') + Course FROM tb WHERE name=@name and Score >= 60
RETURN isnull(@s ,'')
end
else if (@flag = '状态')
begin
SELECT @s = isnull(@s + ' ','') + Status FROM tb WHERE name=@name group by Status-- having(sum(case when Status='正常' then 0 else 1 end) > 0)
RETURN @s
end
else
select @s = NULL
RETURN @s
END
GO
--查询最终结果
select name AS 姓名
, dbo.f_str(name,'缺考') AS 缺考课程
, dbo.f_str(name,'不及格') AS 不及格课程
, dbo.f_str(name,'正常') AS 正常课程
, isnull(dbo.f_str(name,'状态'),'正常') AS 状态
from tb group by name
/*
姓名 缺考课程 不及格课程 正常课程 状态
李四 政治 英语,语文 不及格
王二 C语言,英语 数学 不及格 缺考
张三 C语言,数学,英语 正常
赵五 语文 政治 数学 不及格 缺考
*/
if object_id('Students') is not null
drop table Students --学生表
create table Students(id int identity(1,1),name varchar(10),Department varchar(30))
insert into Students(name,Department) values('张三','计算机系')
insert into Students(name,Department) values('李四','外语系')
insert into Students(name,Department) values('王二','计算机系')
insert into Students(name,Department) values('赵五','数学系')if object_id('Score') is not null
drop table Score --学生成绩表
create table Score(id int identity(1,1),name varchar(10),Course varchar(30),Score int)
insert into Score (name,Course,Score) values('张三','数学',90)
insert into Score (name,Course,Score) values('张三','C语言',70)
insert into Score (name,Course,Score) values('张三','英语',60)
insert into Score (name,Course,Score) values('李四','语文',78)
insert into Score (name,Course,Score) values('李四','英语',81)
insert into Score (name,Course,Score) values('李四','政治',49)
insert into Score (name,Course,Score) values('李四','数学',89)
insert into Score (name,Course,Score) values('赵五','数学',100)
insert into Score (name,Course,Score) values('赵五','政治',54)
insert into Score (name,Course,Score) values('王二','数学',39)if object_id('Course') is not null
drop table Course --必修课程表
create table Course(id int identity(1,1),Department varchar(30),Course varchar(30))
insert into Course (Department,Course) values('计算机系','数学')
insert into Course (Department,Course) values('计算机系','C语言')
insert into Course (Department,Course) values('计算机系','英语')
insert into Course (Department,Course) values('外语系','语文')
insert into Course (Department,Course) values('外语系','英语')
insert into Course (Department,Course) values('外语系','政治')
insert into Course (Department,Course) values('数学系','语文')
insert into Course (Department,Course) values('数学系','数学')
insert into Course (Department,Course) values('数学系','政治')--select a.name,a.Department,b.Course,b.Score from Students a
--left join Score b on a.name=b.name;select c.name,c.Course,case when d.Score is null then '缺考' when d.Score<60 then '不及格' else '' end Score from
(
select a.name,a.Department,b.Course from Students a
left join Course b on a.Department=b.Department
)c
left join Score d on c.name=d.name and c.Course=d.Course--select distinct name
--from
--(
-- select c.name,c.Course,case when d.Score is null then '缺考' when d.Score<60 then '不及格' else '' end Score from
-- (
-- select a.name,a.Department,b.Course from Students a
-- left join Course b on a.Department=b.Department
-- )c
-- left join Score d on c.name=d.name and c.Course=d.Course
--)aselect * from Students
left join
(
select c.name,c.Course,case when d.Score is null then '缺考' when d.Score<60 then '不及格' else '' end Score from
(
select a.name,a.Department,b.Course from Students a
left join Course b on a.Department=b.Department
)c
left join Score d on c.name=d.name and c.Course=d.Course
)a