具有 SUM、COUNT 或聚合结果的动态列的 SQL Pivot
Posted
技术标签:
【中文标题】具有 SUM、COUNT 或聚合结果的动态列的 SQL Pivot【英文标题】:SQL Pivot with dynamic columns with SUM, COUNT or Aggregate results 【发布时间】:2014-04-29 21:31:40 【问题描述】:我有一个查询,它为特定课程的学习者生成结果,显示他们是否完成了一个模块。学习者可以互相学习不同的模块。
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 示例,尝试了一大堆示例,但都无法解决。
非常感谢您的帮助?
谢谢
【问题讨论】:
您使用的是什么 DBMS? 您能否展示您尝试过但没有成功的事情之一?如果我们看不到它,我们如何帮助您了解您做错了什么?如果您只是复制我们给出的答案,您将不会学习如何做到这一点。 您知道您是否对尝试运行动态 sql 的数据库具有执行权限吗?如果没有,动态 sql 将不适合您。您还使用什么数据库?你试过什么? 我使用的是 MS SQL 2012 嗨 Barmar - 我需要重做它们。我很沮丧,我把它们都删了。对不起-下次我会添加它们 【参考方案1】: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) - 另一个派生表步骤将允许您执行此操作。
【讨论】:
我得到一个无效的列名“已完成” - 这是因为它是由 CASE 语句创建的吗? 知道了——效果很好。非常感谢您的帮助 很高兴听到这个消息。将查询结果转储到临时表中并将其用作#TheReport
可能是有意义的,否则您将评估查询两次 - 一次获取列,另一次进行数据透视。以上是关于具有 SUM、COUNT 或聚合结果的动态列的 SQL Pivot的主要内容,如果未能解决你的问题,请参考以下文章