有学生表(SID,name,age,address),课程表(CID,Cname),分数表(SID,CID,score)。
查询没有选修“物理”的学生的信息,
查询每个学生所修课程的分数,用下面的表格形式展现出来如:
姓名 语文 数学 英语 物理 化学
张三 98 88 97 56 76
查询没有选修“物理”的学生的信息,
查询每个学生所修课程的分数,用下面的表格形式展现出来如:
姓名 语文 数学 英语 物理 化学
张三 98 88 97 56 76
use tempdb;
/*
create table 学生表
(
SID int not null,
name nvarchar(10) not null
--age int not null,
--address nvarchar(10) not null
);
insert into 学生表(SID,name)
values
(1,'张三'),(2,'李四');create table 课程表
(
CID int not null,
Cname nvarchar(10) not null
);
insert into 课程表(CID,Cname)
values
(1,'语文'),(2,'数学'),(3,'英语'),(4,'物理'),(5,'化学');create table 分数表
(
SID int not null,
CID int not null,
score int not null
);
insert into 分数表(SID,CID,score)
values
(1,1,98),(1,2,88),(1,3,97),(1,4,56),(1,5,76),
(2,1,30),(2,2,40),(2,3,50),(2,5,60);
*/
--1.查询没有选修“物理”的学生的信息
select *
from 学生表 as t
where t.SID not in
(
select t1.SID
from 分数表 as t1
join 学生表 as t2 on t1.SID = t2.SID
join 课程表 as t3 on t1.CID = t3.CID
where t3.Cname = '物理'
);
--2.查询每个学生所修课程的分数
declare @sql varchar(8000)
set @sql = 'select name '
select @sql = @sql + ' , max(case Cname when ''' + Cname + ''' then score else 0 end) [' + Cname + ']'
from (select distinct Cname from (select t2.name,t3.Cname,t1.score
from 分数表 as t1
join 学生表 as t2 on t1.SID = t2.SID
join 课程表 as t3 on t1.CID = t3.CID) as t1) as a
set @sql = @sql + ' from (select t2.name,t3.Cname,t1.score
from 分数表 as t1
join 学生表 as t2 on t1.SID = t2.SID
join 课程表 as t3 on t1.CID = t3.CID) as t2 group by name'
exec(@sql)
from 学生表 a
where not exists(select 1 from 课程表 b, 分数表 c where b.cid=c.cid and a.sid=c.sid and b.cname='物理')行转列在论坛搜索一下,一大堆
create tableainsert into #TB values('张三' , '语文' , 74)insert into #TB values('张三' , '数学' , 83)insert into #TB values('张三' , '物理' , 93)insert into #TB values('李四' , '语文' , 74)insert into #TB values('李四' , '数学' , 84)insert into #TB values('李四' , '物理' , 94)go--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)select 姓名 as 姓名 , max(case 课程 when '语文' then 分数 else 0 end) 语文, max(case 课程 when '数学' then 分数 else 0 end) 数学, max(case 课程 when '物理' then 分数 else 0 end) 物理from #TBgroup by 姓名--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)declare @sql varchar(8000)set @sql = 'select 姓名 'select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'from (select distinct 课程 from #TB) as aset @sql = @sql + ' from #TB group by 姓名'exec(@sql) --SQL SERVER 2005 静态SQL。select * from (select * from #TB) a pivot (max(分数) for 课程 in (语文,数学,物理)) b--SQL SERVER 2005 动态SQL。declare @sql varchar(8000)select @sql = isnull(@sql + '],[' , '') + 课程 from #TB group by 课程set @sql = '[' + @sql + ']'exec ('select * from (select * from #TB) a pivot (max(分数) for 课程 in (' + @sql + ')) b')