后台c#代码如下:
string sql=""; string sqlMain=""; DataTable dt=DbOperate.ExecuteDataset("select DataCode,DataName from S_DataCode where FieldName='CourseTypeCode'").Tables[0]; for(int i=0;i<dt.Rows.Count;i++) { if(sql.Equals("")) { sql+="d"+dt.Rows[i]["DataCode"].ToString()+"."+dt.Rows[i]["DataName"].ToString()+"学分"; } else { sql+=", d"+dt.Rows[i]["DataCode"].ToString()+"."+dt.Rows[i]["DataName"].ToString()+"学分"; } sqlMain+=" Left outer join (Select studentNo ,Sum(Credit) as "+dt.Rows[i]["DataName"].ToString()+"学分 From vscoScoreLast where {0} and CourseTypeCode='"+dt.Rows[i]["DataCode"].ToString()+"' group by studentNo ) as d"+dt.Rows[i]["DataCode"].ToString()+" on a.StudentNo=d"+dt.Rows[i]["DataCode"].ToString()+".StudentNo"; } sqlResult="select a.*,"+sql+" from (Select 0 as ID,GradeSubjectNo,GradeSubjectName,ClassNo,ClassName,StudentNo,Name,Sum(isnull(Credit,0)) as 总学分,Sum(isnull(Credit,0) * isnull(ScoreDot,0) ) as 总学分绩点,( Sum(isnull(Credit,0)*isnull(ScoreDot,0))/( case Sum(IsNull(Credit,0)) when 0 then 1 else Sum(IsNull(Credit,0)) end )) as 平均学分绩点,Count(*) as 所修门数 from vscoScoreLast where {0} group by StudentNo,Name,ClassNo,ClassName,GradeSubjectNo,GradeSubjectName) as a "+sqlMain; sqlResult=string.Format(sqlResult,this.WhereClause);调试发现生成的sqlResult语句如下,放到查询分析器一查询花费了90s左右:
select a.*,d1.必修课学分, d10.任选课学分, d2.专业限选课学分, d3.公共任选课学分, d4.专业任选课学分, d5.公共必修课学分, d6.专业必修课学分, d7.限定选修课学分, d8.任意选修课学分, d9.毕业实习学分 from ( Select 0 as ID,GradeSubjectNo,GradeSubjectName,ClassNo,ClassName,StudentNo,Name,Sum(isnull(Credit,0)) as 总学分, Sum(isnull(Credit,0) * isnull(ScoreDot,0) ) as 总学分绩点, ( Sum(isnull(Credit,0)*isnull(ScoreDot,0))/( case Sum(IsNull(Credit,0)) when 0 then 1 else Sum(IsNull(Credit,0)) end )) as 平均学分绩点, Count(*) as 所修门数 from vscoScoreLast where TermNo = '2009-201001' and Grade='2008' and GradeSubjectNo='200830641' and CourseTypeCode in ( Select CourseTypeCode From couType) group by StudentNo,Name,ClassNo,ClassName,GradeSubjectNo,GradeSubjectName ) as a Left outer join (Select studentNo ,Sum(Credit) as 必修课学分 From vscoScoreLast where TermNo = '2009-201001' and Grade='2008' and GradeSubjectNo='200830641' and CourseTypeCode in ( Select CourseTypeCode From couType) and CourseTypeCode='1' group by studentNo ) as d1 on a.StudentNo=d1.StudentNo Left outer join (Select studentNo ,Sum(Credit) as 任选课学分 From vscoScoreLast where TermNo = '2009-201001' and Grade='2008' and GradeSubjectNo='200830641' and CourseTypeCode in ( Select CourseTypeCode From couType) and CourseTypeCode='10' group by studentNo ) as d10 on a.StudentNo=d10.StudentNo Left outer join (Select studentNo ,Sum(Credit) as 专业限选课学分 From vscoScoreLast where TermNo = '2009-201001' and Grade='2008' and GradeSubjectNo='200830641' and CourseTypeCode in ( Select CourseTypeCode From couType) and CourseTypeCode='2' group by studentNo ) as d2 on a.StudentNo=d2.StudentNo Left outer join (Select studentNo ,Sum(Credit) as 公共任选课学分 From vscoScoreLast where TermNo = '2009-201001' and Grade='2008' and GradeSubjectNo='200830641' and CourseTypeCode in ( Select CourseTypeCode From couType) and CourseTypeCode='3' group by studentNo ) as d3 on a.StudentNo=d3.StudentNo Left outer join (Select studentNo ,Sum(Credit) as 专业任选课学分 From vscoScoreLast where TermNo = '2009-201001' and Grade='2008' and GradeSubjectNo='200830641' and CourseTypeCode in ( Select CourseTypeCode From couType) and CourseTypeCode='4' group by studentNo ) as d4 on a.StudentNo=d4.StudentNo Left outer join (Select studentNo ,Sum(Credit) as 公共必修课学分 From vscoScoreLast where TermNo = '2009-201001' and Grade='2008' and GradeSubjectNo='200830641' and CourseTypeCode in ( Select CourseTypeCode From couType) and CourseTypeCode='5' group by studentNo ) as d5 on a.StudentNo=d5.StudentNo Left outer join (Select studentNo ,Sum(Credit) as 专业必修课学分 From vscoScoreLast where TermNo = '2009-201001' and Grade='2008' and GradeSubjectNo='200830641' and CourseTypeCode in ( Select CourseTypeCode From couType) and CourseTypeCode='6' group by studentNo ) as d6 on a.StudentNo=d6.StudentNo Left outer join (Select studentNo ,Sum(Credit) as 限定选修课学分 From vscoScoreLast where TermNo = '2009-201001' and Grade='2008' and GradeSubjectNo='200830641' and CourseTypeCode in ( Select CourseTypeCode From couType) and CourseTypeCode='7' group by studentNo ) as d7 on a.StudentNo=d7.StudentNo Left outer join (Select studentNo ,Sum(Credit) as 任意选修课学分 From vscoScoreLast where TermNo = '2009-201001' and Grade='2008' and GradeSubjectNo='200830641' and CourseTypeCode in ( Select CourseTypeCode From couType) and CourseTypeCode='8' group by studentNo ) as d8 on a.StudentNo=d8.StudentNo Left outer join (Select studentNo ,Sum(Credit) as 毕业实习学分 From vscoScoreLast where TermNo = '2009-201001' and Grade='2008' and GradeSubjectNo='200830641' and CourseTypeCode in ( Select CourseTypeCode From couType) and CourseTypeCode='9' group by studentNo ) as d9 on a.StudentNo=d9.StudentNo 一个简单的东西写得这么复杂...,把它修改了一番,执行查询结果只几秒: Select 0 as ID,GradeSubjectNo,GradeSubjectName,ClassNo,ClassName,StudentNo,Name,Sum(isnull(Credit,0)) as 总学分, Sum(isnull(Credit,0) * isnull(ScoreDot,0) ) as 总学分绩点, ( Sum(isnull(Credit,0)*isnull(ScoreDot,0))/( case Sum(IsNull(Credit,0)) when 0 then 1 else Sum(IsNull(Credit,0)) end )) as 平均学分绩点, Count(*) as 所修门数, sum(case CourseTypeCode when '1' then Credit end) as 必修课学分, sum(case CourseTypeCode when '10' then Credit end) as 任选课学分, sum(case CourseTypeCode when '2' then Credit end) as 专业限选课学分, sum(case CourseTypeCode when '3' then Credit end) as 公共任选课学分, sum(case CourseTypeCode when '4' then Credit end) as 专业任选课学分, sum(case CourseTypeCode when '5' then Credit end) as 公共必修课学分, sum(case CourseTypeCode when '6' then Credit end) as 专业必修课学分, sum(case CourseTypeCode when '7' then Credit end) as 限定选修课学分, sum(case CourseTypeCode when '8' then Credit end) as 任意选修课学分, sum(case CourseTypeCode when '9' then Credit end) as 毕业实习学分 from vscoScoreLast where TermNo = '2009-201002' and Grade='2008' and GradeSubjectNo='200830641' and CourseTypeCode in ( Select CourseTypeCode From couType) group by StudentNo,Name,ClassNo,ClassName,GradeSubjectNo,GradeSubjectName 由此修改页面的C#代码如下: string result = ""; StringBuilder sb = new StringBuilder(); for(int i=0;i<dt.Rows.Count;i++) { sb.AppendFormat("sum(case CourseTypeCode when '{0}' then Credit end) as {1}学分,",dt.Rows[i]["DataCode"].ToString(),dt.Rows[i]["DataName"].ToString()); } if(sb.ToString().Length > 0) result = sb.ToString().TrimEnd(','); sqlResult="Select 0 as ID,GradeSubjectNo,GradeSubjectName,ClassNo,ClassName,StudentNo,Name,Sum(isnull(Credit,0)) as 总学分,Sum(isnull(Credit,0) * isnull(ScoreDot,0) ) as 总学分绩点,( Sum(isnull(Credit,0)*isnull(ScoreDot,0))/( case Sum(IsNull(Credit,0)) when 0 then 1 else Sum(IsNull(Credit,0)) end )) as 平均学分绩点,Count(*) as 所修门数, {0} from vscoScoreLast where {1} group by StudentNo,Name,ClassNo,ClassName,GradeSubjectNo,GradeSubjectName"; sqlResult=string.Format(sqlResult, result, this.WhereClause);