具有 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的主要内容,如果未能解决你的问题,请参考以下文章

第六期,聚合函数介绍!!!

第六期,聚合函数介绍!!!

MYSQL单表查询

3 聚合与排序

求SQL的聚合函数的定义,特点,注意事项等

聚合函数查询