Сводные катеорические значения в логические столбцы 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)


SQL Fiddle Demo

Другие вопросы по тегам