Sql server 动态数据透视表
我正在使用这样的select语句Sql server 动态数据透视表,sql-server,tsql,dynamic,pivot,Sql Server,Tsql,Dynamic,Pivot,我正在使用这样的select语句 SELECT FileYear, FileSemester, StudentID, AssessmentCode, AssessAreaHdgAbbrev1, AssessResultsResult FROM vStudentReportsSemesterResults WHERE (FileYear = 2014) AND (FileSemester = 2) AND (assessmentCode LIKE '11%') AND (AssessAreaHdg
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'.
显然,出于某种原因,它没有识别字段。任何帮助都将不胜感激。请尝试:
SELECT StudentID, '+@ColumnName+'
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
常规:选择*从选择foo作为foo轴
请参阅以下文档:
谢谢marc_编辑这篇文章。我有一些图片,但我没有使用这个网站太多,没有足够的信誉点来添加它们。这看起来好多了。我把你的编辑移到了你的问题上,因为它属于这里。您不应该编辑来自其他用户的答案,除非您想更正它们。如果你想回复,你应该写评论,或者更新你的问题。谢谢Leonid。仍在学习…感谢Tomasito提供下面的代码。工作正常,但它仍然不能将所有数据放在一行中。对于每个等级,即使它是相同的评估代码,它也位于新行中。我想要同一行的同一个评估代码的所有内容。这是可能的吗?而且,我想要的不仅仅是学生的ID。我想要学生ID,然后是评估代码,然后是FileYear和FileeMester,然后是所有以Ass 1开头的数据。有了提供的代码,如果我尝试添加评估代码,它将被放在第一列,并删除其他数据。任何帮助都将不胜感激。
USE AdventureWorks2008R2;
GO
SELECT VendorID, [250] AS Emp1, [251] AS Emp2, [256] AS Emp3, [257] AS Emp4, [260] AS Emp5
FROM
(SELECT PurchaseOrderID, EmployeeID, VendorID
FROM Purchasing.PurchaseOrderHeader) AS p
PIVOT
(
COUNT (PurchaseOrderID)
FOR EmployeeID IN
( [250], [251], [256], [257], [260] )
) AS pvt
ORDER BY VendorID;