【发布时间】:2016-05-22 06:35:23
【问题描述】:
我有一个结构如下的表:
cpf ddd phone type origin
11111111111 83 81021111 M SERASA
11111111111 83 87472222 M SERASA
11111111111 83 81023333 M TRANSUNION
11111111111 83 88724444 M TRANSUNION
11111111111 83 87475555 M TRANSUNION
22222222222 43 36271111 F SERASA
22222222222 44 36272222 F SERASA
22222222222 43 36273333 F TRANSUNION
22222222222 43 36284444 F TRANSUNION
33333333333 51 51811111 F SERASA
33333333333 51 56212222 F SERASA
33333333333 51 96213333 M SERASA
我需要“去规范化”这个表,所以每个 CPF 将只有一行,类似这样:
CPF DDD_1 PHONE_1 TYPE_1 ORIGIN_1 DDD_2 PHONE_2 TYPE_2 ORIGIN_2 DDD_3 PHONE_3 TYPE_3 ORIGIN_3 DDD_4 PHONE_4 TYPE_4 ORIGIN_4 DDD_5 PHONE_5 TYPE_5 ORIGIN_5
11111111111 83 81021111 M SERASA 83 87472222 M SERASA 83 81023333 M TRANSUNION 83 88724444 M TRANSUNION 83 8747555 M TRANSUNION
22222222222 43 36271111 F SERASA 44 36272222 F SERASA 43 36273333 F TRANSUNION 43 36274444 F TRANSUNION NULL NULL NULL NULL
33333333333 51 51811111 F SERASA 51 56212222 F SERASA 51 96213333 M SERASA NULL NULL NULL NULL NULL NULL NULL NULL
一位队友建议使用Pivot + Unpivot,但我没有找到如何使用它,因为我没有定义列的字段,也没有聚合(sum,count等)。
我使用与表本身连接的少量数据(100 行),但由于数据量(表有 3300 万行),此解决方案不起作用。
现在我被卡住了,任何帮助将不胜感激。
【问题讨论】:
-
“我没有定义列的字段”这是第一步 - 使用
ROWNUM创建一个查询,该查询标识每个cpf组中的行号。然后旋转会容易得多 -
我更喜欢交叉表而不是原生枢轴。我发现语法不那么迟钝,性能通常更好一点。这是一篇关于交叉表的精彩文章。 sqlservercentral.com/articles/T-SQL/63681 如果你需要使这个动态,你可以使用动态交叉表。 sqlservercentral.com/articles/Crosstab/65048
标签: sql sql-server tsql pivot sql-server-2014