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】:
假设您已知或最大数量TYPE
s,您可以使用 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 常规透视的主要内容,如果未能解决你的问题,请参考以下文章