[英]TSQL Dynamic Pivot Table
I am using a select statement like this... 我正在使用这样的选择语句...
SELECT FileYear, FileSemester, StudentID, AssessmentCode, AssessAreaHdgAbbrev1, AssessResultsResult
FROM vStudentReportsSemesterResults
WHERE (FileYear = 2014) AND (FileSemester = 2) AND (assessmentCode LIKE '11%') AND (AssessAreaHdgAbbrev2 = 'Grade')
This gives me 这给我
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
I would like to dynamically pivot the data to give me something which looks like 我想动态地旋转数据以给我一些看起来像
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
Note that it has to be dynamic as the number of assessment points may change from subject to subject and year to year etc. 请注意,它必须是动态的,因为评估点的数量可能因科目不同以及年份等而变化。
I have looked at information on this and tried to put together a dynamic pivot like 我查看了有关此方面的信息,并尝试将动态枢纽
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
I keep getting error messages like 我不断收到类似的错误消息
Msg 156, Level 15, State 1, Line 5
消息156,第15层,状态1,第5行
Incorrect syntax near the keyword 'PIVOT'.关键字“ PIVOT”附近的语法错误。
I am assuming this is because of the quotation marks or the where statement syntax. 我假设这是因为引号或where语句语法。 I am getting a little frustrated and was just wondering if anyone could have a look at my code and tell me how I could dynamically pivot the data so that it gives the Grades in columns rather than in separate rows.
我有些沮丧,只是想知道是否有人可以看一下我的代码,并告诉我如何动态地旋转数据,以便它以列而不是单独的行的形式给出成绩。
Any help would be much appreciated. 任何帮助将非常感激。
Thanks so much for your help. 非常感谢你的帮助。
My code now looks like... 我的代码现在看起来像...
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
when I run this I get 当我运行这个我得到
Msg 207, Level 16, State 1, Line 7
Invalid column name 'AssessAreaHdgAbbrev1'.
Msg 207, Level 16, State 1, Line 8
Invalid column name 'AssessResultsResult'.
Obviously it is not recognizing the fields for some reason. 显然,由于某种原因,它无法识别这些字段。 Any help would be greatly appreciated.
任何帮助将不胜感激。
Try: 尝试:
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
Generaly: SELECT * FROM (SELECT foo) AS Foo PIVOT ...
一般:
SELECT * FROM (SELECT foo) AS Foo PIVOT ...
Look at documentation for PIVOT : 查看有关PIVOT的文档:
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.