ALTERPROC usp_GetCrossScore4( @StuNamevarchar(10) ) AS -- creates a temp table to hold the score records CREATETABLE #ScoreTbl( ScoreId int, SubjectName varchar(50), StudentName varchar(10), ScoreValue real, ExamDate datetime, AvgFlag bitDEFAULT(0) -- marks as the average of some subject ) -- populates basic data of some student INSERTINTO #ScoreTbl(ScoreId, SubjectName, StudentName, ScoreValue, ExamDate) SELECT ScoreId, SubjectName, StudentName, ScoreValue, ExamDate FROM t_Score s WHERE s.StudentName =@StuName -- calculates total for per subject and appends to the temp table INSERTINTO #ScoreTbl(ScoreId, SubjectName, StudentName, ScoreValue, ExamDate, AvgFlag) SELECTNULL, SubjectName, StudentName, AVG(ScoreValue), NULL, 1FROM #ScoreTbl s GROUPBY SubjectName, StudentName --SELECT * FROM #ScoreTbl DECLARE@Sqlvarchar(8000) -- NOTE: some known bug -> you make sure the length of the dynamical sql is less than 8000. -- fortunately, Mr Zou have made a deep discussion againt it at http://blog.youkuaiyun.com/zjcxc/archive/2003/12/29/20075.aspx. SET@Sql='SELECT SubjectName 科目' SELECT@sql=@sql+', SUM(CASE ExamDate WHEN '''+CONVERT(varchar(20), ExamDate, 102) +''' THEN ScoreValue ELSE NULL END)'''+CAST(YEAR(ExamDate) ASVARCHAR) +'年'+CAST(MONTH(ExamDate) ASVARCHAR) +'月'+CAST(DAY(ExamDate) ASVARCHAR) +'日''' FROM (SELECTDISTINCT ExamDate FROM t_Score s WHERE s.StudentName =@StuName) ss SET@Sql=@Sql+', SUM(CASE AvgFlag WHEN 1 THEN ScoreValue ELSE NULL END) ''平均分''' --PRINT @Sql -- runs the dynamical sql statement EXEC(@sql+' FROM #ScoreTbl s GROUP BY SubjectName') ALTERPROC usp_GetCrossScore4( @StuNamevarchar(10) ) AS -- creates a temp table to hold the score records CREATETABLE #ScoreTbl( ScoreId int, SubjectName varchar(50), StudentName varchar(10), ScoreValue real, ExamDate datetime, AvgFlag bitDEFAULT(0) -- marks as the average of some subject ) -- populates basic data of some student INSERTINTO #ScoreTbl(ScoreId, SubjectName, StudentName, ScoreValue, ExamDate) SELECT ScoreId, SubjectName, StudentName, ScoreValue, ExamDate FROM t_Score s WHERE s.StudentName =@StuName -- calculates total for per subject and appends to the temp table INSERTINTO #ScoreTbl(ScoreId, SubjectName, StudentName, ScoreValue, ExamDate, AvgFlag) SELECTNULL, SubjectName, StudentName, AVG(ScoreValue), NULL, 1FROM #ScoreTbl s GROUPBY SubjectName, StudentName --SELECT * FROM #ScoreTbl DECLARE@Sqlvarchar(8000) -- NOTE: some known bug -> you make sure the length of the dynamical sql is less than 8000. -- fortunately, Mr Zou have made a deep discussion againt it at http://blog.youkuaiyun.com/zjcxc/archive/2003/12/29/20075.aspx. SET@Sql='SELECT SubjectName 科目' SELECT@sql=@sql+', SUM(CASE ExamDate WHEN '''+CONVERT(varchar(20), ExamDate, 102) +''' THEN ScoreValue ELSE NULL END)'''+CAST(YEAR(ExamDate) ASVARCHAR) +'年'+CAST(MONTH(ExamDate) ASVARCHAR) +'月'+CAST(DAY(ExamDate) ASVARCHAR) +'日''' FROM (SELECTDISTINCT ExamDate FROM t_Score s WHERE s.StudentName =@StuName) ss SET@Sql=@Sql+', SUM(CASE AvgFlag WHEN 1 THEN ScoreValue ELSE NULL END) ''平均分''' --PRINT @Sql -- runs the dynamical sql statement EXEC(@sql+' FROM #ScoreTbl s GROUP BY SubjectName')