Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 pivot. Развернуть таблицу по 2 полям.  [new]
Halfling
Member

Откуда:
Сообщений: 260
Здравствуйте, есть табличка:
name value number type_id
qwe 12.5 1 1
qwe 13.5 2 1
qwe 18.5 3 2
qwe 10.5 4 1
asd 23.3 1 1
asd 23.4 2 3
asd 23.6 3 1
asd 23.8 4 3
asd 22.3 5 2
asd 27.3 6 1


Как можно развернуть ее к виду:
name 1 1_type 2 2_type 3 3_type 4 4_type 5 5_type 6 6_type
qwe 12.5 1 13.5 1 18.5 1 10.5 1 null null null null
asd 23.3 1 23.4 3 23.6 1 23.8 3 22.3 2 27.3 1


Microsoft SQL Server 2005 - 9.00.4053.00 (X64)

Йоды у учился я.
23 май 11, 10:06    [10692458]     Ответить | Цитировать Сообщить модератору
 Re: pivot. Развернуть таблицу по 2 полям.  [new]
Начинающий SQL 2008
Member

Откуда:
Сообщений: 438
Halfling,

Можно попробовать через case, один из вариантов
Динамическое преобразование строк в колонки
23 май 11, 10:24    [10692550]     Ответить | Цитировать Сообщить модератору
 Re: pivot. Развернуть таблицу по 2 полям.  [new]
Halfling
Member

Откуда:
Сообщений: 260
Начинающий SQL 2008, Спасибо! Получилось, работает.

>>Можно попробовать через case, один из вариантов

Для общего развития, альтернативу этому решению не подскажете?
24 май 11, 09:53    [10698196]     Ответить | Цитировать Сообщить модератору
 Re: pivot. Развернуть таблицу по 2 полям.  [new]
Начинающий SQL 2008
Member

Откуда:
Сообщений: 438
Halfling
Для общего развития, альтернативу этому решению не подскажете?
Case - это тот же самый Pivot. По скорости они равны. В свое время iap это исследовал и сделал правильный вывод, что ничего революционного Microsoft не придумал :(

На всякий случай альтернативы для UnPivot
declare @t table (id int, cause varchar(max), sn1 varchar(max), sn2 varchar(max), sn3 varchar(max))
insert @t values (3841, 'причина1', '004044', '004248', '004246'), (3841, 'причина1', null, '004248', null)
select * from @t

-- Если через UnPivot, то строки с Null отбрасываются
select * from @t unpivot (sn for tmp in (sn1,sn2,sn3)) unp
Вариант через cross apply. Null`ы не пропадают, да и план выполнения меньше чем через UnPivot (с) iljy
select id, cause, sn, tmp
from @t 
cross apply (select sn1 sn, 'sn1' [tmp]  union all select sn2, 'sn2'  union all select sn3, 'sn3') i
24 май 11, 12:56    [10699482]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить