Как разделить строки и преобразовать их в заголовки столбцов? - PullRequest
3 голосов
/ 14 января 2020

Как вы можете взять строку (и) и преобразовать ее в столбец (динамически, так как исходная строка (и) изменится):

Пример:

(select *
 from table 
 inner join
    (select column1, [dynamic field] from table) as dynamic_data
 on table.column1 = dynamic_data.column1)


Column1
------
a,b,c
c,d,e
a,f,e

к этому

column1 a b c d e f
-------------------
a,b,c  |x|x|x| | | |
c,d,e  | | |x|x|x| |
a,f,e  |x| | | |x|x|

1 Ответ

1 голос
/ 14 января 2020

Используйте like и case:

select column1,
       (case when ',' + column1 + ',' like '%,a,%' then 'x' end) as a,
       (case when ',' + column1 + ',' like '%,b,%' then 'x' end) as b,
       (case when ',' + column1 + ',' like '%,c,%' then 'x' end) as c,
       (case when ',' + column1 + ',' like '%,d,%' then 'x' end) as d,
       (case when ',' + column1 + ',' like '%,e,%' then 'x' end) as e,
       (case when ',' + column1 + ',' like '%,f,%' then 'x' end) as f
from t;

Я не уверен, почему необходим «Dynami c». Проблема не в исходных строках, а в целевых столбцах. Если вам нужно, чтобы они соответствовали исходным строкам, тогда вам нужно использовать Dynami c SQL. , , и это кажется довольно сложным.

РЕДАКТИРОВАТЬ:

Сердце динамического c SQL объединяет выражения case. Вы можете сделать это, используя string_split() и string_agg() (или эквивалентные функции в более старых версиях SQL Server):

select string_agg(replace('      (case when '','' + column1 + '','' like ''%,[value],%'' then ''x'' end) as [value]', '[value]', value), '
'
                 ) within group (order by value) as cols
from (select distinct value
      from t cross apply
           string_split(t.column1, ',')
     ) t

Здесь - это db <> fiddle.

Я позволю вам составить остальную часть запроса.

...