http://expert.csdn.net/Expert/topic/1620/1620620.xml?temp=.6626245

解决方案 »

  1.   

    TO:caiyunxia(monkey)
    我用“交叉报表”已经实现了,不过又出现一个问题了,不过只能取得学生的学号,取不到学生的姓名,我明天将代码贴上来。
    另外又出来了一个问题:由于科目由用户自行添加的,所以在“交叉报表”时会有很大的困难,灵活性不够,可能是我的代码问题。
      

  2.   

    select st_id as 学号,
    sum(case kmdh when 'cc001' then kmcj else 0 end) as 语文,
    sum(case kmdh when 'cc002' then kmcj else 0 end) as 数学,
    sum(case kmdh when 'cc003' then kmcj else 0 end) as 英语
     from cj group by st_id order by 学号 asc
    语文,数学,英语等科目是由用户自行添加的,假如用户有十个科目(而且程序员根本不知道用户将来会添加什么科目)那上面的SQL语句就缺乏弹性了,有什么好的解决办法?另外上面的SQL语句只能取出学生的学号,还未能取出学生的姓名。要取出姓名是用子查询还是用联表查询?
      

  3.   

    create table student(st_id int ,st_name varchar(20))
    insert into student values(1,'YOki')
    insert into student values(2,'Tom')
    go
    create table km(kmdh varchar(10) ,kmmc varchar(20))
    insert into km values('001','English')
    insert into km values('002','Computer')
    insert into km values('003','History')
    go
    create table cj(st_id int,kmdh varchar(10),kmcj int)
    insert into cj values(1,'001',57)
    insert into cj values(1,'002',44)
    insert into cj values(1,'003',90)
    insert into cj values(2,'001',45)
    insert into cj values(2,'003',99)select (select st_name from student where st_id=a.st_id) as 学生姓名,
           (select kmmc from km where kmdh=a.kmdh) as 课程名称,
            kmcj
    into #temp
    from cj a declare @sql varchar(8000)
    set @sql='select 学生姓名'
    select @sql=@sql+',sum(case 课程名称 when '''+课程名称+''' then kmcj else 0 end) as '+课程名称
    from (select distinct 课程名称 from #temp) as a
    select @sql=@sql+',sum(kmcj) as 总分,identity(int,1,1) as 排名 into Score from #temp group by 学生姓名 order by sum(kmcj) desc'
    exec(@sql)
    select * from score
    drop table score
    drop table #temp
      

  4.   

    create table student(st_id int ,st_name varchar(20))
    insert into student values(1,'YOki')
    insert into student values(2,'Tom')
    go
    create table km(kmdh varchar(10) ,kmmc varchar(20))
    insert into km values('001','English')
    insert into km values('002','Computer')
    insert into km values('003','History')
    go
    create table cj(st_id int,kmdh varchar(10),kmcj int)
    insert into cj values(1,'001',57)
    insert into cj values(1,'002',44)
    insert into cj values(1,'003',90)
    insert into cj values(2,'001',45)
    insert into cj values(2,'003',99)select (select st_name from student where st_id=a.st_id) as 学生姓名,(select kmmc from km where kmdh=a.kmdh) as 课程名称,kmcj into #temp from cj a declare @sql varchar(8000)
    set @sql='select 学生姓名'
    select @sql=@sql+',sum(case 课程名称 when '''+课程名称+''' then kmcj else 0 end) ['+课程名称+']'
    from (select distinct 课程名称 from #temp) as a
    exec(@sql+',sum(kmcj) 总分 into # from #temp group by 学生姓名 order by sum(kmcj) desc ALTER TABLE # ADD 排名 bigint identity(1,1) not null select * from #')go
    drop table student,km,cj,#temp
      

  5.   

    1、你不能用固定表!
    2、你不能直接 用identity into出来!
      

  6.   

    谢谢大力的指教
    不过我不太明白为什么不能用第2项??
    若不用identity into的话,第2个临时表也没有必要存在
      

  7.   

    ALTER TABLE # ADD 排名 bigint identity(1,1) not null关键是这个