SQL Pivot,动态列具有总和、计数或聚合结果

SQL Pivot,动态列具有总和、计数或聚合结果,sql,sql-server-2012,pivot,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,

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

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示例,尝试了一大堆示例,但都无法解决这个问题

我真的很感激你的帮助

谢谢

这种方法在以下情况下效果良好:

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);
报告是查询的结果-您可以将其逐字包含为派生表


还有一件事要做,就是将当前保留为原始单元ID的列别名化-另一个派生表步骤将允许您这样做。

您使用的是什么DBMS?您能展示一个您尝试过但没有成功的方法吗?如果我们看不到,我们如何帮助你理解你做错了什么?如果您只是复制我们给出的答案,您将无法学习如何执行。您知道您是否对尝试运行动态sql的数据库具有执行权限吗?否则,动态sql将不适用于您。还有,您使用的是什么数据库?您尝试过什么?我正在使用MS SQL 2012 Hi Barmar-我需要重做它们。我很沮丧,把它们都删掉了。抱歉-下次我将添加它们时,我得到了一个无效的列名“Completed”-这是因为它是由CASE语句创建的吗?明白-这非常有效。非常感谢你的帮助。很高兴听到这个消息。将查询结果转储到临时表中并将其用作报告可能是有意义的,否则您将对查询进行两次计算—一次用于获取列,另一次用于进行透视。