大家帮帮忙?UP者有分。

如何将一个表的数据行取出来生成一个视图,使表的数据行的记录变为视图的字段,而且表的数据是不确定的.
例如:我现在的成绩表是
学号,姓名,课程名称,成绩
01 刘勤东 语文 80
02 刘勤东 数学 75
我想转成
学号,姓名,语文,数学
01 刘勤东 80 75

请大家帮忙解决,谢谢

---------------------------------------------------------------

视图不能解决问题,用存储过程

找找以前的贴,很多

---------------------------------------------------------------

declare @sql varchar(8000)
set @sql = 'select 学号,姓名'
select @sql = @sql + ',sum(case 课程名称 when '''+课程名称+''' then 成绩 else 0 end) ['+课程名称+']'
from (select distinct 课程名称 from 有一表) as a
select @sql = @sql+' from 有一表 group by 学号,姓名'

exec(@sql)
go

---------------------------------------------------------------

你的意思是将课程名程取出来形成列!
我觉的你的表设计上有问题!
应当将课程名称再做一张表:
学生表:
学号,姓名,课程id,成绩
课程表:
课程号,课程名

这样设计时就不必用写存储过程来实现了!视图好像实现不了~
---------------------------------------------------------------

declare @sql varchar(8000)
set @sql = 'select 学号,姓名'
select @sql = @sql + ',sum(case 课程名称 when '''+课程名称+''' then 成绩 else 0 end) ['+课程名称+']'
from (select distinct 课程名称 from 有一表) as a
select @sql = @sql+' from 有一表 group by 学号,姓名'

exec(@sql)
go

---------------------------------------------------------------

学习
---------------------------------------------------------------

up
---------------------------------------------------------------

declare @sql varchar(8000)
set @sql = 'select 学号,姓名'
select @sql = @sql + ',sum(case 课程名称 when '''+课程名称+''' then 成绩 else 0 end) ['+课程名称+']'
from (select distinct 课程名称 from 有一表) as a
select @sql = @sql+' from 有一表 group by 学号,姓名'

exec(@sql)
go

---------------------------------------------------------------

up
---------------------------------------------------------------

我也想过多种办法,可用动态生成生数据窗口的办法。先对要做列的分组,得到所有的值,再用这些值生成SQL语句!
---------------------------------------------------------------

如果课程名称 不会增加
可以不用动态SQL
select 学号,姓名,sum(case 课程名称 when 语文 then 成绩 else 0 end) 语文,
sum(case 课程名称 when 数学 then 成绩 else 0 end) 数学
from 有一表 group by 学号,姓名
否者只能用动态SQL
或在程序中用交叉报表

---------------------------------------------------------------

up

---------------------------------------------------------------

up
---------------------------------------------------------------

学习兼混分
---------------------------------------------------------------

来了,别急!!
create table 成绩表(
studentid varchar(10) not null,
courseid varchar(5) not null,
achieve numeric(28,8) null)

select * from 成绩表
delete from 成绩表
insert 成绩表
select
'0001' , '001' , 80
union
select
'0001','002',80

create table 学籍表
(
Studentid Varchar(10) not null,
studentname varchar(20) null)

select * from 学籍表
insert 学籍表
select '0001' , '刘勤东'

create table 课程表(
courseid Varchar(5) not null,
coursename varchar(20) null)
insert 课程表
select
'001' , '语文'
union
select
'002', '数学'

if exists(select Id from sysobjects where ID=Object_ID('AAA'))
drop table AAA
go
create table AAA(StudentID Varchar(10),
Studentname varchar(20)
primary key(studentID) )
go
declare @Coursename Varchar(20)
declare BB_Cursor cursor for
select coursename from 课程表
open BB_Cursor
fetch next from BB_Cursor into @Coursename
while @@fetch_status <>-1
begin
exec(' alter table AAA
Add '+@Coursename+' numeric(28,8) null ')
fetch next from BB_Cursor into @Coursename
end
close BB_cursor
deallocate BB_cursor

go
--select * from AAA
delete from AAA

declare @Coursename Varchar(20),
@studentID Varchar(10),
@StudentName varchar(20),
@achieve Numeric(28,8),
@OldStudentName varchar(20),
@Count Varchar(10)
declare BB_Cursor cursor for
select A.studentID,B.Studentname,C.Coursename,A.achieve
from 成绩表 A,学籍表 B,课程表 C
where A.studentID=b.Studentid and A.courseID=C.CourseID

select @OldStudentName='#$^$%^'
open BB_Cursor
fetch next from BB_Cursor into @studentID,@studentName,@Coursename,@achieve
while (@@fetch_status <>-1 )
begin
if @OldStudentname<>@StudentName
begin
select @Count=Cast(@achieve As Varchar(100))
exec('Insert AAA(StudentID, StudentName,'+@Coursename+' ) select ''' +@studentID+''', '''+@studentname+''','+@Count+' ')
select @OldStudentname= @StudentName
end
else
begin
exec(' Update AAA set '+@courseName+'='+@Count+' where (StudentID='''+@StudentID+''') ')
select 1
end
fetch next from BB_Cursor into @studentID,@studentName,@Coursename,@achieve
end
close BB_cursor
deallocate BB_cursor
go
--------------------

select * from AAA
go

---------------------------------------------------------------

up
---------------------------------------------------------------

up
---------------------------------------------------------------

up
呵呵。。。

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus