【发布时间】:2014-10-16 20:21:35
【问题描述】:
我正在使用这样的选择语句...
SELECT FileYear, FileSemester, StudentID, AssessmentCode, AssessAreaHdgAbbrev1, AssessResultsResult
FROM vStudentReportsSemesterResults
WHERE (FileYear = 2014) AND (FileSemester = 2) AND (assessmentCode LIKE '11%') AND (AssessAreaHdgAbbrev2 = 'Grade')
这给了我
FileYear FileSemester StudentID assessmentCode AssessAreaHdgAbbrev1 AssessResultsResult
-------------------------------------------------------------------------------------------
2014 2 41965 11ENGADV Ass1 C
2014 2 41965 11ENGADV Ass2 C
2014 2 41965 11ENGADV Ass3 C
2014 2 41965 11ENGADV Prelim
2014 2 41965 11HISANC Ass1 A
2014 2 41965 11HISANC Ass2 B
2014 2 41965 11HISANC Ass3 B
2014 2 41965 11HISANC Prelim
2014 2 41965 11HISMOD Ass1 B
2014 2 41965 11HISMOD Ass2 B
2014 2 41965 11HISMOD Ass3
2014 2 41965 11HISMOD Prelim
2014 2 41965 11MATGEN Ass1 B
2014 2 41965 11MATGEN Ass2
2014 2 41965 11MATGEN Prelim
2014 2 41965 11PEDPDH Ass1 B
2014 2 41965 11PEDPDH Ass2 B
2014 2 41965 11PEDPDH Ass3
2014 2 41965 11PEDPDH Ass4
2014 2 41965 11PEDPDH Prelim
我想动态旋转数据以给我一些看起来像
FileYear FileSemester StudentID AssessmentCode Ass1 Ass2 Ass3 Ass4 Prelim
---------------------------------------------------------------------------------
2014 2 41965 11ENGADV C C C
2014 2 41965 11HISANC A B B
2014 2 41965 11HISMOD B B
2014 2 41965 11MATGEN B
2014 2 41965 11PEDPDH B B
请注意,它必须是动态的,因为评估点的数量可能会因学科和年份而异。
我已经查看了这方面的信息,并尝试将动态支点放在一起
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
select @ColumnName= ISNULL(@ColumnName + ',','') + QUOTENAME(AssessAreaHdgAbbrev1)
FROM (SELECT DISTINCT AssessAreaHdgAbbrev1
FROM vStudentReportsSemesterResults
WHERE (FileYear = 2014) AND (FileSemester = 2) AND (AssessAreaHdgAbbrev2 = 'Grade') AND (AssessmentCode LIKE '11%')) AS Courses
SET @DynamicPivotQuery = N'
SELECT FileYear, FileSemester, StudentID, AssessmentCode, AssessAreaHdgAbbrev1, AssessResultsResult
FROM vStudentReportsSemesterResults
WHERE (FileYear = 2014) AND (FileSemester = 2) AND (AssessAreaHdgAbbrev2 = ''grade'') AND (AssessmentCode LIKE ''11%'')
PIVOT
(
MAX(AssessResultsResult)
FOR AssessAreaHdgAbbrev1 IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
我不断收到类似
的错误消息消息 156,第 15 级,状态 1,第 5 行
关键字“PIVOT”附近的语法不正确。
我假设这是因为引号或 where 语句语法。我有点沮丧,只是想知道是否有人可以查看我的代码并告诉我如何动态旋转数据,以便它在列中而不是在单独的行中给出成绩。
任何帮助将不胜感激。
更新
非常感谢您的帮助。
我的代码现在看起来像...
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
select @ColumnName= ISNULL(@ColumnName + ',','') + QUOTENAME(AssessAreaHdgAbbrev1)
FROM (SELECT DISTINCT AssessAreaHdgAbbrev1
FROM vStudentReportsSemesterResults
WHERE (FileYear = 2014) AND (FileSemester = 2) AND (AssessAreaHdgAbbrev2 = 'Grade') AND (AssessmentCode LIKE '11%')) AS Courses
SET @DynamicPivotQuery = N'
SELECT
FileYear,
FileSemester,
StudentID,
AssessmentCode,
AssessAreaHdgAbbrev1,
AssessResultsResult
FROM (
SELECT * FROM vStudentReportsSemesterResults
WHERE (FileYear = 2014)
AND (FileSemester = 2)
AND (AssessAreaHdgAbbrev2 = ''grade'')
AND (AssessmentCode LIKE ''11%'')) src
PIVOT (MAX(AssessResultsResult) FOR AssessAreaHdgAbbrev1 IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
当我运行它时,我得到了
Msg 207, Level 16, State 1, Line 7
Invalid column name 'AssessAreaHdgAbbrev1'.
Msg 207, Level 16, State 1, Line 8
Invalid column name 'AssessResultsResult'.
显然由于某种原因它无法识别这些字段。任何帮助将不胜感激。
【问题讨论】:
-
感谢 marc_s 编辑此内容。我有一些图片,但我没有经常使用这个网站,也没有足够的声誉点来添加它们。这看起来好多了。
-
我将您的编辑移至您的问题,因为它属于这里。除非您想更正它们,否则您不应编辑其他用户的答案。如果您想回复,您应该写评论或更新您的问题。
-
感谢列昂尼德。还在学习中...
-
感谢 Tomasito 提供以下代码。效果很好,但它仍然没有将所有数据放在一行中。对于每个等级,即使它是相同的评估代码,它也是在一个新的行中。我想要同一行上的一个评估代码的所有内容。这可能吗?
-
另外,我想要的不仅仅是学生证。我想要学生 ID,然后是评估代码,然后是 FileYear 和 FileSemester,然后是所有以 Ass 1 开头的数据。使用提供的代码,如果我尝试添加评估代码,它会被放在第一列并消失其他数据。任何帮助将不胜感激。
标签: sql-server tsql dynamic pivot