Sql 按顺序将行转换为特定的通用列

Sql 按顺序将行转换为特定的通用列,sql,sql-server,salesforce,Sql,Sql Server,Salesforce,我有一个存储身份和种族信息的表格,如下所示: 不幸的是,种族数据在一列中,用分号分隔 我使用以下方法将分号拆分成行,并在每行中添加id号,以便于识别 选择按salesforce\u id超额订购的行数作为rownum,x.salesforce\u id,值 来自JRM\u导出\u联系人x 交叉应用字符串_splitipeds _种族';'按SALESFORCE\u ID、值分组 数据现在至少被分成了单独的行 然而,我现在面临的问题是如何获取这些信息并将其放入一个表中,该表将遵循以下格式: sal

我有一个存储身份和种族信息的表格,如下所示:

不幸的是,种族数据在一列中,用分号分隔

我使用以下方法将分号拆分成行,并在每行中添加id号,以便于识别

选择按salesforce\u id超额订购的行数作为rownum,x.salesforce\u id,值 来自JRM\u导出\u联系人x 交叉应用字符串_splitipeds _种族';'按SALESFORCE\u ID、值分组 数据现在至少被分成了单独的行

然而,我现在面临的问题是如何获取这些信息并将其放入一个表中,该表将遵循以下格式:

salesforce_id、race_1、race_2、race_3、race_4、race_5

我曾尝试使用一个与上面提到的字符串_split组合的PIVOT,但这将基于种族名称生成列,而不是生成通用列

比如:

挑选* 从…起 选择按salesforce\u id、salesforce\u id、值超额订购的行数 来自JRM\u导出\u联系人 交叉应用字符串_splitipeds _种族';' src pivotmaxvalue表示[非洲裔美国人],[美洲印第安人或阿拉斯加土著],[美洲印第安人或阿拉斯加土著],…[等]p 我也尝试过使用CTE和左外连接几次,但性能非常差

是否有更好的方法按照我在第一步中添加的行号所确定的顺序转置这些列?

尝试以下方法:

select ec.*
from JRM_EXPORT_CONTACT outer apply
     (select max(case when seqnum = 1 then value end) as race_1,
             max(case when seqnum = 2 then value end) as race_2,
             max(case when seqnum = 3 then value end) as race_3,
             max(case when seqnum = 4 then value end) as race_4,
             max(case when seqnum = 5 then value end) as race_5                 
      from (select value, row_number() over (order by by (select null)) as seqnum
            from string_split(ec.ipeds_ethnicities, ';')
           ) e
     ) e
通过在每一行内而不是跨所有行进行旋转,您应该会看到性能的提高

请注意,string_split不能保证返回的行的顺序。行数并不能保证行的顺序正确。如果排序很重要,可以使用原始字符串:

      from (select value,
                   row_number() over (order by charindex(';' + value + ';', ';' + ec.ipeds_ethnicities + ';')) as seqnum
            from string_split(ec.ipeds_ethnicities, ';')
           ) e

我建议交叉结算。你想要什么样的订单;您的行数表达式是按salesforce_id排序的,但是,拆分后,您将拥有同一salesforce_id的多个实例。示例数据预期结果(如格式化文本或DDL和DML语句)将有助于我们为您提供帮助。