【问题标题】:SQL Server General PivotingSQL Server 常规透视
【发布时间】: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 操作符有什么问题呢?或者,或者,限制较少的方法,条件聚合。
  • 我想不出一种方法来进行查询。你知道怎么做吗?
  • 到目前为止你尝试了什么,为什么没有成功?

标签: sql-server sql-server-2012 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。
猜你喜欢
  • 2015-10-26
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 2013-06-06
相关资源
最近更新 更多