我有一个表,用于存储ID和种族信息,如下所示:
不幸的是,种族数据位于由分号分隔的单个列中。
我使用以下内容将分号分成几行,并在每行中添加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
现在至少将数据分为几行。
但是我现在遇到的问题是如何获取此信息并将其放入将采用以下格式的表中:
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
确定的顺序转置这些列?
答案 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