有学生表(SID,name,age,address),课程表(CID,Cname),分数表(SID,CID,score)。
查询没有选修“物理”的学生的信息,
查询每个学生所修课程的分数,用下面的表格形式展现出来如:
   姓名     语文      数学    英语    物理   化学
   张三      98        88      97      56     76

解决方案 »

  1.   


    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) 
      

  2.   

    --查询没有选修“物理”的学生的信息select a.*
    from 学生表 a
    where not exists(select 1 from 课程表 b, 分数表 c where b.cid=c.cid and a.sid=c.sid and b.cname='物理')行转列在论坛搜索一下,一大堆
      

  3.   

    http://blog.csdn.net/maco_wang/archive/2011/03/27/6281484.aspx
      

  4.   


    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')