请帮我写个SQL SERVER的语句,显示:姓名 英语 格式不知道怎么写,请看补充:所要查询的问题:查询各个学生语文、数学、英语、历史课程成绩,例如下表:姓名\x05语文\x05数学\x05英语\x05历史张
来源:学生作业帮助网 编辑:六六作业网 时间:2024/11/25 15:54:54
请帮我写个SQL SERVER的语句,显示:姓名 英语 格式不知道怎么写,请看补充:所要查询的问题:查询各个学生语文、数学、英语、历史课程成绩,例如下表:姓名\x05语文\x05数学\x05英语\x05历史张
请帮我写个SQL SERVER的语句,显示:姓名 英语 格式不知道怎么写,请看补充:
所要查询的问题:
查询各个学生语文、数学、英语、历史课程成绩,例如下表:
姓名\x05语文\x05数学\x05英语\x05历史
张萨\x0578 \x0567\x0589\x0576
王强 \x0589 \x0567 \x0584 \x0596
李三\x0570 \x0587 \x0592 \x0556
李四 \x0580\x0578 \x0597\x0566
这是最后要显示的格式,我就是不知道就格式应该怎么写,我是这样做的:先建一个总的视图,把所有的列表示出来,然后,再分别为语言,英语,历史建立四个视图,这样一来通过:
select yuwen.学生姓名,yuwen.成绩as shuxue.成绩AS yingwu.成绩AS 英语成绩,lishi.成绩AS
from yuwen
inner join shuxue
on yuwen.学生姓名=shuxue.学生姓名
inner join yingwu
on yuwen.学生姓名=yingwu.学生姓名
inner join lishi
on lishi.学生姓名=yuwen.学生姓名
就可以显示上面所示的视图了,但这样好麻烦,也不实用,请问,你有更好的的法子吗,该怎么写语句?
下面是建表和视力的语句:
--学生表
CREATE TABLE member(
mid char(10) primary key,
mname char(50) not null,
);
--课程表
CREATE TABLE course(
fid char(10) primary key,
fname char(50) not null,
);
--成绩表
select * from score
CREATE TABLE score(
scid int identity(1,1) primary key,
fid char(10) foreign key(fid) references course(fid),
mid char(10) foreign key(mid) references member(mid),
sconum int,
);
--课程表中插入数据--
insert into course
values('F001',
insert into course
values('F002',
insert into course
values('F003','英语')
insert into course
values('F004',
--学生表中插入数据--
select * from member
insert into member
values('M001','张萨')
insert into member
values('M002','王强')
insert into member
values('M003','李三')
insert into member
values('M004','李四')
insert into member
values('M005','阳阳')
insert into member
values('M006','虎子')
insert into member
values('M007','夏雪')
insert into member
values('M008','璐璐')
insert into member
values('M009','珊珊')
insert into member
values('M010','香奈儿')
--成绩表中插入数据--
SELECT * FROM score
order by scid,fid
INSERT INTO score
values('F004','M009',79)
INSERT INTO score
values('F001','M001',78)
INSERT INTO score
values('F002','M001',67)
INSERT INTO score
values('F003','M001',89)
INSERT INTO score
values('F004','M001',76)
INSERT INTO score
values('F001','M002',89)
INSERT INTO score
values('F001','M002',67)
INSERT INTO score
values('F003','M002',84)
INSERT INTO score
values('F004','M002',96)
INSERT INTO score
values('F001','M003',70)
INSERT INTO score
values('F002','M003',87)
INSERT INTO score
values('F003','M003',92)
INSERT INTO score
values('F004','M003',56)
INSERT INTO score
values('F001','M004',80)
--先创建一个总的视图
drop view vw2
CREATE VIEW VW2(学生号,学生姓名,课程号,课程名,成绩编号,成绩)
AS
select m.mid,m.mname,c.fid,c.fname,s.scid,s.sconum
from member m
inner join score s
on m.mid=s.mid
inner join course c
on c.fid=s.fid
再创建各科视图
create view yuwen
AS
select 学生姓名,成绩
FROM vw2
where 课程名='语文'
select m.mname 学生姓名,s1.sconum s2.sconum s3.sconum 英语,s4.sconum from member m
\x05left outer join score s1 on m.mid = s1.mid and s1.fid='F001'
\x05left outer join score s2 on m.mid = s2.mid and s2.fid='F002'
\x05left outer join score s3 on m.mid = s3.mid and s3.fid='F003'
\x05left outer join score s4 on m.mid = s4.mid and s4.fid='F004'
用这个自连接也可以实现问题,但这样做有哪些不好的地方,比效率等……
请帮我写个SQL SERVER的语句,显示:姓名 英语 格式不知道怎么写,请看补充:所要查询的问题:查询各个学生语文、数学、英语、历史课程成绩,例如下表:姓名\x05语文\x05数学\x05英语\x05历史张
declare @sql varchar(8000)
set @sql = 'select mname as ' + '姓名'
select @sql = @sql + ' , max(case fname when ''' + fname + ''' then sconum else 0 end) [' + fname + ']'
from (select distinct fname from course) as a
set @sql = @sql + ' from score s, member m,course c where s.mid = m.mid and c.fid = s.fid group by m.mname'
exec(@sql)