读书人

这样的视图怎么提取?

发布时间: 2012-01-13 22:43:29 作者: rapoo

这样的视图如何提取???
一个在线考试系统的数据库,有个视图是这样设计的,请问如何实现
通过sql可以提取到如下的表

考生姓名 试卷名称 题目id 考生答案 标准答案
姓名1 名称1 Qid1 xxxx xxxx
姓名1 名称1 Qid2 xxxx xxxx
姓名1 名称2 Qid3 xxxx xxxx
姓名1 名称2 Qid4 xxxx xxxx
姓名1 名称3 Qid5 xxxx xxxx
姓名1 名称3 Qid6 xxxx xxxx
姓名2 名称1 Qid7 xxxx xxxx
姓名2 名称1 Qid8 xxxx xxxx
姓名2 名称2 Qid9 xxxx xxxx
姓名2 名称2 Qid10 xxxx xxxx
姓名2 名称3 Qid11 xxxx xxxx
姓名2 名称3 Qid12 xxxx xxxx
。。。。。。。

*其中xxxx为任意值,题目名称也可能更多

如何生成这样的视图:

考生名称 (试卷)名称1 (试卷)名称2 (试卷)名称3
姓名1 得分x 得分x 得分x
姓名2 得分x 得分x 得分x
。。。。。。。

得分是通过一些简单的判断得出来的。

就这些分数了,全抛了!

[解决办法]
create table T(考生姓名 varchar(10), 试卷名称 varchar(10), 题目id varchar(10) , 考生答案 varchar(10) , 标准答案 varchar(10))
insert T select '姓名1 ', '名称1 ', 'Qid1 ', 'xxxx ', 'xxxx '
union all select '姓名1 ', '名称1 ', 'Qid2 ', 'xxxx ', 'xxxx '
union all select '姓名1 ', '名称2 ', 'Qid3 ', 'xxxx ', 'xxxx '
union all select '姓名1 ', '名称2 ', 'Qid4 ', 'xxxx ', 'xxxx '
union all select '姓名1 ', '名称3 ', 'Qid5 ', 'xxxx ', 'xxxx '
union all select '姓名1 ', '名称3 ', 'Qid6 ', 'xxxx ', 'xxxx '
union all select '姓名2 ', '名称1 ', 'Qid7 ', 'xxxx ', 'xxxx '


union all select '姓名2 ', '名称1 ', 'Qid8 ', 'xxxx ', 'xxxx '
union all select '姓名2 ', '名称2 ', 'Qid9 ', 'xxxx ', 'xxxx '
union all select '姓名2 ', '名称2 ', 'Qid10 ', 'xxxx ', 'xxxx '
union all select '姓名2 ', '名称3 ', 'Qid11 ', 'xxxx ', 'xxxx '
union all select '姓名2 ', '名称3 ', 'Qid12 ', 'xxxx ', 'xxxx '


declare @sql varchar(8000)
set @sql= 'select 考生姓名, '
select @sql=@sql+quotename(rtrim(试卷名称))+ '=max(case when 试卷名称= ' ' '+rtrim(试卷名称)+ ' ' ' then 题目id end), '
from T
group by 试卷名称
select @sql=left(@sql, len(@sql)-1), @sql=@sql+ ' from T group by 考生姓名 '

exec(@sql)
[解决办法]
有问题啊,试卷的分数在表里都没有, 那怎么生成啊?

[解决办法]
先生成分数,再用动态SQL
[解决办法]


create table T(考生姓名 varchar(10), 试卷名称 varchar(10), 题目id varchar(10) , 考生答案 varchar(10) , 标准答案 varchar(10))
insert T select '姓名1 ', '名称1 ', 'Qid1 ', 'xxxx ', 'xxxx '
union all select '姓名1 ', '名称1 ', 'Qid2 ', 'xxxx ', 'xxxx '
union all select '姓名1 ', '名称2 ', 'Qid3 ', 'xxxx ', 'xxxx '
union all select '姓名1 ', '名称2 ', 'Qid4 ', 'xxxx ', 'xxxx '
union all select '姓名1 ', '名称3 ', 'Qid5 ', 'xxxx ', 'xxxx '
union all select '姓名1 ', '名称3 ', 'Qid6 ', 'xxxx ', 'xxxx '
union all select '姓名2 ', '名称1 ', 'Qid7 ', 'xxxx ', 'xxxx '
union all select '姓名2 ', '名称1 ', 'Qid8 ', 'xxxx ', 'xxxx '
union all select '姓名2 ', '名称2 ', 'Qid9 ', 'xxxx ', 'xxxx '
union all select '姓名2 ', '名称2 ', 'Qid10 ', 'xxxx ', 'xxxx '
union all select '姓名2 ', '名称3 ', 'Qid11 ', 'xxxx ', 'xxxx '
union all select '姓名2 ', '名称3 ', 'Qid12 ', 'xxxx ', 'xxxx '


declare @sql varchar(8000)
set @sql= 'select 考生姓名, '
select @sql=@sql+quotename(rtrim(试卷名称))+ '=sum(case when 试卷名称= ' ' '+rtrim(试卷名称)+ ' ' ' then case when 考生答案=标准答案 then 1 else 0 end end), '
from T
group by 试卷名称
select @sql=left(@sql, len(@sql)-1), @sql=@sql+ ' from T group by 考生姓名 '

exec(@sql)

读书人网 >SQL Server

热点推荐