Dynami c битовое выравнивание нескольких строк путем поворота в дополнительные столбцы - PullRequest
1 голос
/ 25 марта 2020

У меня есть данные, которые выглядят так:

ID  | Value
-----------
1   |   a 
1   |   b 
2   |   a
2   |   c
3   |   a
3   |   d

И мне бы хотелось, чтобы это выглядело так:

ID  | Value_a  |  Value_b | Value_c | Value_d
---------------------------------------------
1   |    1     |     1    |    0    |    0
2   |    1     |     0    |    1    |    0
3   |    1     |     0    |    0    |    1

Я думаю, что требуется динамическое c условное агрегирование , Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 25 марта 2020

Условное агрегирование выглядит так:

select 
    id,
    max(case when value = 'a' then 1 else 0 end) value_a,
    max(case when value = 'b' then 1 else 0 end) value_b,
    max(case when value = 'c' then 1 else 0 end) value_c,
    max(case when value = 'd' then 1 else 0 end) value_d
from mytable
group by id
1 голос
/ 30 марта 2020

Вот пример реализации динамического c условного агрегирования:

--create test table
create table #values (
     [ID] int
    ,[Value] char(1))

--populate test table
insert into #values
values
     (1, 'a') 
    ,(1, 'b') 
    ,(2, 'a')
    ,(2, 'c')
    ,(3, 'a')
    ,(3, 'd')

--declare variable that will hold dynamic query
declare @query nvarchar(max) = ' select [ID] '

--build dynamic query and assign it to variable 
select 
    @query = @query + max(',max(case when [value] = ''' 
    + [value] + ''' then 1 else 0 end) as Value_' + [value] ) 
from 
    #values 
group by 
    [value]

--add group by clause to dunamic query
set  @query = @query + ' from #values group by [id]'

--execute dynamic query
exec (@query) 

это результат:

enter image description here

Теперь вы можете добавить значение (например, id = 4 и value = 'e'), заменив исходную вставку на эту:

insert into #values
values
     (1, 'a') 
    ,(1, 'b') 
    ,(2, 'a')
    ,(2, 'c')
    ,(3, 'a')
    ,(3, 'd')
    ,(4, 'a')
    ,(4, 'e')

это новый вывод:

enter image description here

...