我有一个查询,可以在特定课程中为学员生成结果,显示他们是否已完成模块。学习者可以互相采用不同的模块。
declare @CourseID int = 9
SELECT LearnerID, UnitID,
CASE WHEN (SUM(Total - [Total Achieved])) = 0 THEN 'Yes' ELSE 'No' END
AS Completed FROM dbo.LMS_Achieved_Standards_Report
GROUP BY CourseID, LearnerID, UnitID having CourseID = @CourseID
结果看起来像这样
LearnerID UnitID Completed
15 15 Yes
15 28 No
28 28 Yes
116 150 Yes
79 12 No
69 34 Yes
69 15 No
我需要它看起来像这样:
LearnerID Unit 15 Unit 28 Unit 150 Unit 12 Unit 34
15 Yes No
28 Yes
116 Yes
79 Yes
69 No Yes
已经陈述的另一个因素是它们都可以采用不同的单位,因此我无法创建具有设置列标题的PIVOT。
我已经看过PIVOT的其他动态列示例,尝试了一大堆示例,但是无法解决这个问题。
我真的很感激一些帮助吗?
由于
答案 0 :(得分:0)
This dynamic pivot方法效果很好:
DECLARE
@cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(UnitID)
FROM TheReport
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT LearnerID, ' + @cols + ' from
TheReport
pivot
(
min(Completed)
for UnitId in (' + @cols + ')
) p '
execute(@query);
TheReport
是查询的结果 - 您可以将其逐字地包含在派生表中。
还有一件事就是进行列别名(当前保留为原始单位ID) - 另一个派生表步骤将允许您执行此操作。