Разделите значения, разделенные точкой с запятой, на множество столбцов и присвойте столбцам логическое значение 1, если значение соответствует имени столбца, иначе присвойте 0 - PullRequest
0 голосов
/ 04 марта 2020

У меня есть данные в виде значений, разделенных точкой с запятой, которые представлены в одном столбце под названием «Основной столбец», как показано ниже, максимум до 12 уникальных значений. Я хотел разделить эти значения на 12 таких отдельных столбцов, как bv, fv, iv et c и эти отдельные столбцы должны заполняться либо 1 (если он соответствует значениям первичного столбца), либо 0 (если нет соответствия значениям первичного столбца).

Данные основного столбца

enter image description here

Например,

, если у основного столбца есть данные

bv; fv; iv; kv; lr; lv ; lz; mv; sh; sv; sz; wv;

, тогда все 12 отдельных столбцов должны быть заполнены 1.

Если у основного столбца есть данные bv; fv; IV; тогда только три отдельных столбца (bv, fv, iv) должны иметь логическое значение 1, а другие значения столбца должны быть 0.

и т. д.

Пожалуйста, не могли бы вы помочь мне с быстрым SQL Заявление для достижения вышеуказанных требований?

Ответы [ 2 ]

3 голосов
/ 04 марта 2020

Вы можете использовать case выражения. В SELECT это будет выглядеть следующим образом:

select (case when col like '%bv%' then 1 else 0 end) as bv,
       (case when col like '%fv%' then 1 else 0 end) as fv,
       . . . 

Приведенные выше работы предполагают, что «коды» всегда состоят из двух символов.

Или, если коды могут быть переменной длины, возьмите разделители во внимание:

select (case when ';' + col + ';' like '%;bv;%' then 1 else 0 end) as bv,
       (case when ';' + col + ';' like '%;fv;%' then 1 else 0 end) as fv,
       . . . 

Это также может быть легко включено в update.

0 голосов
/ 04 марта 2020

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

SELECT MAX(CASE WHEN SS.item = 'bv' THEN 1 ELSE 0 END AS bv,
       MAX(CASE WHEN SS.item = 'fv' THEN 1 ELSE 0 END AS fv,
       ...
       MAX(CASE WHEN SS.item = 'wv' THEN 1 ELSE 0 END AS wv
FROM dbo.YourTable YT
     CROSS APPLY STRING_SPLIT(YT.YourColumn,';') SS;

Лично, однако, я бы предложить исправить свой дизайн и нормализовать его.

...