日期:2014-05-18  浏览次数:20397 次

求列传行的进一步扩展算法
列传行的问题经过各位大大的帮助完成了, 如下贴
http://topic.csdn.net/u/20120223/14/845d7b0c-61df-495b-a138-08823cee3bae.html

现在引申了一个新的问题,在上帖子的基础如何实现 添加文科总分(上例子中的语、英、生物),理科总分(数、理、化)字段
最终形成如下报表
SQL code

/*
姓名     语文    数学    物理    英语    化学    生物    文科    理科   平均分    总分
------ ------- ------- ------- ------- ------- -------  ------- ------- ------- -------
李四     74      84      94      缺考    缺考    缺考    74      178    42        252
张三     74      83      93      白卷    缺考    88      162     176    56.33     338
*/



------解决方案--------------------
居然如此,那你的科目就是固定的,没有必要用到动态SQL语句吧?直接写成静态的语句就行了.
------解决方案--------------------
SQL code

create table tblSubjectItem
(
    siID int,
    siName varchar(20)
)

insert into tblSubjectItem(siID, siName)values(1, '语文');
insert into tblSubjectItem(siID, siName)values(2, '数学');
insert into tblSubjectItem(siID, siName)values(3, '物理');
insert into tblSubjectItem(siID, siName)values(4, '英语');
insert into tblSubjectItem(siID, siName)values(5, '化学');
insert into tblSubjectItem(siID, siName)values(6, '生物');

create table tblScoreResult
(
   [Name]    varchar(10) ,
   subjectID int ,
   Score  int                -- 0 白卷; -1 or null 缺考
)

insert into tblScoreResult([Name] , subjectID , Score) values('张三' , 1 , 74)
insert into tblScoreResult([Name] , subjectID , Score) values('张三' , 2 , 83)
insert into tblScoreResult([Name] , subjectID , Score) values('张三' , 3 , 93)
insert into tblScoreResult([Name] , subjectID , Score) values('张三' , 4 , 0)
insert into tblScoreResult([Name] , subjectID , Score) values('张三' , 5 , -1)
insert into tblScoreResult([Name] , subjectID , Score) values('张三' , 6 , 88)
insert into tblScoreResult([Name] , subjectID , Score) values('李四' , 1 , 74)
insert into tblScoreResult([Name] , subjectID , Score) values('李四' , 2 , 84)
insert into tblScoreResult([Name] , subjectID , Score) values('李四' , 3 , 94)


declare @sql varchar(6000)

select @sql=
'with t as
(select c.name,c.siname,isnull(d.score,-1) score
from
(select a.name,b.siname,b.siID from
(select distinct Name from tblScoreResult) a
cross join tblSubjectItem b) c
left join tblScoreResult d on c.name=d.name and c.siID=d.subjectID
)
select name,'

select @sql=@sql+
'(select case when score=-1 then ''缺考'' when score=0 then ''白卷'' 
else cast(score as varchar(3)) end from t t2 where t2.name=t.name and t2.siname='''+siName+''') '''+siName+''','
from tblSubjectItem

select @sql=@sql
+'sum(case when siname in (''语文'',''英语'',''生物'') then score else 0 end) ''文科'', '
+'sum(case when siname in (''数学'',''物理'',''化学'') then score else 0 end) ''理科'', '
+'sum(case when score=-1 then 0 else score end)/(select count(*) from tblSubjectItem) ''平均分'','
+'sum(case when score=-1 then 0 else score end) ''总分'' from t group by name '

exec(@sql)

name       语文   数学   物理   英语   化学   生物   文科     理科          平均分         总分
---------- ---- ---- ---- ---- ---- ---- ----------- ----------- ----------- -----------
李四         74   84   94   缺考   缺考   缺考     72          177         42          252
张三         74   83   93   白卷   缺考   88      162         175         56          338