SQL Server 常规透视

Posted

技术标签:

【中文标题】SQL Server 常规透视【英文标题】:SQL Server General Pivoting 【发布时间】:2021-12-06 15:04:46 【问题描述】:

我有一个名为 Comments 的 SQL 表,它有 2 列:NCC_CLTID 和 NCC_CTYPE

表格有以下信息

NCC_CLTID   NCC_CTYPE
TEST1         A 
TEST1         A 
TEST1         C
TEST1         E
TEST1         E
TEST1         E 
TEST1         E
TEST2         A
TEST2         B
TEST2         B
TEST2         C

我想要一个如下所示的数据透视表:

NCC_CLTID TYPE1 TYPE2 TYPE3 TYPE4 TYPE5 TYPE6 TYPE7 TYPE8 ... TYPE20
TEST1       A    A      C     E    E      E     E    NULL      NULL
TEST2       A    B      B     C    NULL   NULL  NULL  NULL      NULL

我怎样才能做到这一点?出于某种原因,我看不出有什么方法可以完成这项工作

【问题讨论】:

那么PIVOT 操作符有什么问题呢?或者,或者,限制较少的方法,条件聚合。 我想不出一种方法来进行查询。你知道怎么做吗? 到目前为止你尝试了什么,为什么没有成功? 【参考方案1】:

假设您已知或最大数量TYPEs,您可以使用 row_number() 来确定列

示例

Select *
 From (
        Select [NCC_CLTID]
              ,[NCC_CTYPE]
              ,Item = concat('Type',row_number() over (partition by [NCC_CLTID] order by [NCC_CTYPE]) )
        from YourTable
      ) src
 Pivot (max([NCC_CTYPE]) for Item in ([Type1],[Type2],[Type3],[Type4],[Type5],
                                      [Type6],[Type7],[Type8],[Type9],[Type10],
                                      [Type11],[Type12],[Type13],[Type14],[Type15],
                                      [Type16],[Type17],[Type18],[Type19],[Type20]
                                     ) ) pvt 

结果

【讨论】:

完美!!这是一个正确的答案。太感谢了。只是一个问题,为什么我们使用 max 作为聚合? @PedroEmilioVélez 总是乐于提供帮助。我使用 MAX 作为字符串的默认值。您可以使用 MIN,但是 SUM 或其他聚合对非数字没有意义。数据透视需要聚合 完成!非常感谢约翰。仅针对我的最后一个问题:列数的限制是什么?如果我想为 Types 添加 50 列,我该如何升级这个过程? @PedroEmilioVélez 50 列不会有问题。只需添加到 ITEM IN ( ... ,[Type21],[Type22], ... ,[Type50]) 确保将 [] 列名括起来并确保它们用逗号分隔。 @PedroEmilioVélez 只是为了清楚。 SQL Server 的最大列数为 1,024。

以上是关于SQL Server 常规透视的主要内容,如果未能解决你的问题,请参考以下文章

“常规”数据透视表和 olap 类型数据透视表之间的区别

将 SQL Server CE 数据库与常规 SQL Server 数据库同步

sql server 简单常规表用法

如何防止数据透视图成为工作表副本上的常规图表?

MS SQL Server 2008 R2 常规操作

SQL Server数据类型