请帮我写个SQL SERVER的语句,显示:姓名 语文 数学 英语 历史 格式不知道怎么写,请看补充:

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请帮我写个SQL SERVER的语句,显示:姓名 语文 数学 英语 历史 格式不知道怎么写,请看补充:相关的知识,希望对你有一定的参考价值。

所要查询的问题:
查询各个学生语文、数学、英语、历史课程成绩,例如下表:
姓名 语文 数学 英语 历史
张萨 78 67 89 76
王强 89 67 84 96
李三 70 87 92 56
李四 80 78 97 66
这是最后要显示的格式,我就是不知道就格式应该怎么写,我是这样做的:先建一个总的视图,把所有的列表示出来,然后,再分别为语言,数学,英语,历史建立四个视图,这样一来通过:
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
left outer join score s1 on m.mid = s1.mid and s1.fid='F001'
left outer join score s2 on m.mid = s2.mid and s2.fid='F002'
left outer join score s3 on m.mid = s3.mid and s3.fid='F003'
left outer join score s4 on m.mid = s4.mid and s4.fid='F004'
用这个自连接也可以实现问题,但这样做有哪些不好的地方,比效率等……

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)

追问

有些看不懂这个,能说明一下吗,谢谢。

追答

1、定义一个拼接sql 的变量
2、拼接查询语句,所用的条件都是拼成的,除了部分值
3、执行sql语句,得到结果、

追问

''' -这三个是什么意思,不像要用到三个分开的'的符号吗,是特定的意义吗?

追答

就是拼接一个所要执行的sql字符串,当然要用 ' 分割啦。

参考资料:http://blog.csdn.net/vipxiaotian/article/details/4409423

参考技术A SELECT MNAME,
SUM(CASE FNAME WHEN '语文' THEN sconum ELSE 0 END) AS 语文成绩,
SUM(CASE FNAME WHEN '数学' THEN sconum ELSE 0 END) AS 数学成绩,
SUM(CASE FNAME WHEN '英语' THEN sconum ELSE 0 END) AS 英语成绩,
SUM(CASE FNAME WHEN '历史' THEN sconum ELSE 0 END) AS 历史成绩,
FROM VW2
差不多这样的格式
参考技术B 用CASE
SELECT MNAME,
CASE FNAME WHEN '语文' THEN sconum ELSE 0 END AS 语文成绩,
CASE FNAME WHEN '数学' THEN sconum ELSE 0 END AS 数学成绩,
。。。
FROM VW2

基本上就是这样,试试吧追问

能帮我写一下吗,呵呵,谢谢。

追答

SELECT MNAME,
SUM(CASE FNAME WHEN '语文' THEN sconum ELSE 0 END) AS 语文成绩,
SUM(CASE FNAME WHEN '数学' THEN sconum ELSE 0 END) AS 数学成绩,
SUM(CASE FNAME WHEN '英语' THEN sconum ELSE 0 END) AS 英语成绩,
SUM(CASE FNAME WHEN '历史' THEN sconum ELSE 0 END) AS 历史成绩
FROM VW2
GROUP BY MNAME

参考技术C 你这是一个纵转横的问题,百度搜索一下 sql纵转横,好多例子

如何更新php sql中的一列(点)[重复]

【中文标题】如何更新php sql中的一列(点)[重复]【英文标题】:How to Update one column (point) in php sql [duplicate] 【发布时间】:2015-06-16 07:54:55 【问题描述】:

请帮我用 php 和 sql 编写完整的代码,只更新下表中的(点)。

表名:tuser

id_user : 12
name : lisa
username : lisa1990
password : User123
point : 12930

【问题讨论】:

请帮我写完整的php和sql代码来更新? UPDATE tuser SET point = 'whatever' WHERE id=12; 好了,玩得开心。 UPDATE tablename SET columnname = value WHERE 条件。 【参考方案1】:

这很容易......

$con = mysql_connect("servername","username","password");
mysql_select_db("databasename");
$command = "UPDATE tuser SET point='your value' where id=whatever";
//replace 'your value' with the new value and "whatever" with the user id
mysql_query($command);
mysql_close_connection($con);

下次不要在这里问这么愚蠢的问题......使用谷歌

【讨论】:

以上是关于请帮我写个SQL SERVER的语句,显示:姓名 语文 数学 英语 历史 格式不知道怎么写,请看补充:的主要内容,如果未能解决你的问题,请参考以下文章

求个sqlserver查询语句

Winforms:如何使用 C# 将图片上传到 SQL Server 数据库

C语言谁能帮我写个for循环给二维数组赋值

谁来帮我写这一句Sql语句

请帮我写一个简单的DIV+CSS网页布局例子

sql server查询问题。