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

时间:2019-07-19 15:30:36

标签: sql sql-server salesforce

我有一个表,用于存储ID和种族信息,如下所示:

enter image description here

不幸的是,种族数据位于由分号分隔的单个列中。

我使用以下内容将分号分成几行,并在每行中添加ID号,以便于识别。

select row_number() over(order by salesforce_id) as rownum, x.salesforce_id, value 
from JRM_EXPORT_CONTACT x 
cross apply string_split(ipeds_ethnicities,';') group by SALESFORCE_ID, value

现在至少将数据分为几行。

enter image description here

但是我现在遇到的问题是如何获取此信息并将其放入将采用以下格式的表中:

salesforce_id,种族_1,种族_2,种族3,种族4,种族5

我尝试使用结合了上述PIVOT的{​​{1}},但这将根据种族名称生成列,而不是在我的通用列中生成。

类似:

string_split

我还尝试过使用CTE并多次进行外部联接,但是这样做的性能非常差。

是否有更好的方法按照第一步中添加的select * from ( select row_number() over(order by salesforce_id) id, salesforce_id, value from JRM_EXPORT_CONTACT cross apply string_split(ipeds_ethnicities,';') ) src pivot(max(value) for value in ([African American], [American Indian or Alaska Native], [American Indian or Alaskan Native], ....[ETC]))p 确定的顺序转置这些列?

1 个答案:

答案 0 :(得分:1)

尝试这种方法:

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()不保证返回行的顺序。并且row_number()不保证行的顺序正确。如果订购很重要,则可以使用原始字符串:

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