Сводные катеорические значения в логические столбцы SQL
Я пытаюсь "сгладить" свой набор данных для облегчения анализа данных. Каждый категориальный столбец должен быть изменен на несколько логических столбцов. У меня есть столбец с категориальными значениями, например:
ID col1
1 A
2 B
3 A
Я ищу способ поворота этой таблицы, и у меня есть агрегированная функция, сообщающая мне, имеет ли этот идентификатор значение A или B:
Результат:
ID col1A col1B
1 1 0
2 0 1
3 1 0
Я пытался использовать PIVOT, но понятия не имею, какую агрегированную функцию использовать внутри него.
Также искал ответы в SF, но не мог найти...
Я использую MS-SQL 2012.
Любая помощь будет оценена! Омри
РЕДАКТИРОВАТЬ:
Количество категорий в col1 неизвестно, поэтому решение должно быть динамическим. Спасибо:)
1 ответ
Попробуй это:
select ID,
col1A=(case when col1='A' then 1 else 0 end),
col1B=(case when col1='B' then 1 else 0 end)
from <table>
Если у вас есть один идентификатор с A и B, и вы хотите иметь отдельный идентификатор в выходных данных, которые вы могли бы сделать
select ID,
col1A=max(case when col1='A' then 1 else 0 end),
col1B=max(case when col1='B' then 1 else 0 end)
from <table>
group by id
РЕДАКТИРОВАТЬ
Согласно вашему комментарию, если вы не знаете количество опций для col1, то вы можете перейти на динамический PIVOT
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(col1)
from <table>
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT id, ' + @cols + ' from <table>
pivot
(
count([col1])
for col1 in (' + @cols + ')
) p '
print(@query)
execute(@query)