版本SQL 2000:
DECLARE @dynamicCols VARCHAR(8000);
SET @dynamicCols = '';
SELECT @dynamicCols = @dynamicCols+
', SUM(CASE WHEN sport.sportid='''+sportid+''' THEN grade.grade END) AS ['+sport+'] '
FROM sport
EXECUTE (
'SELECT student.idnumber AS ID, student.student AS Student '
+@dynamicCols+
'FROM student
JOIN grade on student.idnumber=grade.idnumber
JOIN enrol on enrol.sportid=grade.sportid
JOIN sport on sport.sportid=enrol.sportid
WHERE enrol.teacher=''91'' AND enrol.sy=''2014''
GROUP BY student.idnumber, student.student
ORDER BY student.student')
原始答案
好的,既然没有人站出来,我将展示如何动态地完成它。
基于YOusaFZai手动完成的模板,首先创建选择列表中的动态项,然后将它们合并到其余的选择语句中,最后执行这个动态语句:
DECLARE @sqlSTR VARCHAR(MAX);
DECLARE @dynamicCols VARCHAR(MAX);
SELECT @dynamicCols =
(
SELECT ', SUM(CASE WHEN sport.sportid='''+sportid+''' THEN grade.grade END) AS ['+sport+'] '
FROM sport
FOR XML PATH('')
)
SELECT @sqlSTR =
'SELECT student.idnumber AS ID, student.student AS Student '+@dynamicCols+
'FROM student
JOIN grade on student.idnumber=grade.idnumber
JOIN enrol on enrol.sportid=grade.sportid
JOIN sport on sport.sportid=enrol.sportid
WHERE enrol.teacher=''91'' AND enrol.sy=''2014''
GROUP BY student.idnumber, student.student
ORDER BY student.student'
EXEC(@sqlSTR)
高级:
有时您可能会预期到不良数据,您可以保护自己。例如,如果成绩表中可能存在不在运动表中的运动ID,则可以像以下示例更改第一个查询以包含结果中的不良数据:
SELECT @dynamicCols =
(
SELECT DISTINCT ', SUM(CASE WHEN grade.sportid='''+grade.sportid+''' THEN grade.grade END) AS ['+ISNULL(sport.sport,'ILLEGAL ID #'+grade.sportid)+'] '
FROM grade
LEFT JOIN sport ON sport.sportid = grade.sportid
FOR XML PATH('')
)