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语句创建的吗?明白-这非常有效。非常感谢你的帮助。很高兴听到这个消息。将查询结果转储到临时表中并将其用作报告可能是有意义的,否则您将对查询进行两次计算—一次用于获取列,另一次用于进行透视。