带有SUM,COUNT或Aggregate结果的动态列的SQL Pivot

时间:2014-04-29 21:31:41

标签: sql sql-server-2012 pivot

我有一个查询,可以在特定课程中为学员生成结果,显示他们是否已完成模块。学习者可以互相采用不同的模块。

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的其他动态列示例,尝试了一大堆示例,但是无法解决这个问题。

我真的很感激一些帮助吗?

由于

1 个答案:

答案 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是查询的结果 - 您可以将其逐字地包含在派生表中。

SqlFiddle here

还有一件事就是进行列别名(当前保留为原始单位ID) - 另一个派生表步骤将允许您执行此操作。