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

Откуда:
Сообщений: 76
Добрый день!

Помогите, пожалуйста, разобраться с UNPIVOT.

Есть таблица tmp:
ABC
НаименованиеФормаНомер
ГорноеОАО0000002


Нужно получить:
столбец1столбец2
НаименованиеГорное
ФормаОАО
Номер0000002


Делаю так:
select [Поле] from (
		select A,B,C
		from tmp) as t
UNPIVOT ([Поле] FOR fields in (A,B,C)
	) AS unpvt


Результат:
Поле
Наименование
Форма
Номер
Горное
ОАО
0000002


Подскажите, как вывести результат в два столбца?
30 янв 14, 16:59    [15495913]     Ответить | Цитировать Сообщить модератору
 Re: Транспонирование таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
UNPIVOT-ом тут и не пахнет
Потому что он никак не может связать две произвольные записи
30 янв 14, 17:47    [15496235]     Ответить | Цитировать Сообщить модератору
 Re: Транспонирование таблицы  [new]
o-o
Guest
Lanselot ,
так наоборот же нужен pivot,
идет же разворачивание строк в столбцы.

либо 3 раза написать:
выбрать A -- ему пивот
выбрать B -- ему пивот
выбрать C -- ему пивот
и юнионом склеить

либо да, сперва анпивотить все в 1 столбец,
а потом пивотом развернуть.
только нужна нумерация строк:

declare @t table (A varchar(100),	B varchar(100),	C varchar(100))
insert into @t values
('Наименование',	'Форма',	'Номер'),
('Горное',	'ОАО',	'0000002')

;with cte as
(select ROW_NUMBER() over(order by A desc) as rn, * 
from @t
)

,unp as (
select rn,
       n,
       case n
           when 1 then A
           when 2 then B
           when 3 then C
       end as val
from cte cross join (values(1), (2), (3))v(n)
)

select *
from unp pivot (max(val) for rn in ([1], [2]))p
30 янв 14, 17:50    [15496250]     Ответить | Цитировать Сообщить модератору
 Re: Транспонирование таблицы  [new]
Lanselot
Member

Откуда:
Сообщений: 76
Тогда может выбрать по одному нужному столбцу а потом их объединить?
30 янв 14, 17:51    [15496254]     Ответить | Цитировать Сообщить модератору
 Re: Транспонирование таблицы  [new]
Lanselot
Member

Откуда:
Сообщений: 76
Дело еще и в том, что таблица tmp может иметь различное число полей.
30 янв 14, 17:55    [15496280]     Ответить | Цитировать Сообщить модератору
 Re: Транспонирование таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
Lanselot
Дело еще и в том, что таблица tmp может иметь различное число полей.

И записей наверное тоже ?
30 янв 14, 17:58    [15496303]     Ответить | Цитировать Сообщить модератору
 Re: Транспонирование таблицы  [new]
o-o
Guest
Lanselot
Тогда может выбрать по одному нужному столбцу а потом их объединить?

вот-вот, уже ближе к истине.
выбрать по одному + каждый отпивотить

только чтоб не вышло вот так:

Наименование Горное
ОАО Форма
Номер 0000002

надо строки пронумеровать.
чтоб из первой строки всегда шел в первый столбец, а из второй во второй
30 янв 14, 17:59    [15496305]     Ответить | Цитировать Сообщить модератору
 Re: Транспонирование таблицы  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
declare @t table (A varchar(100),	B varchar(100),	C varchar(100))
insert into @t values
('Наименование',	'Форма',	'Номер'),
('Горное',	'ОАО',	'0000002'),
('Равнинное',	'ЗАО',	'0000001')

select * from @t 


SELECT ID, Colname,  Value
FROM 
    (SELECT ROW_NUMBER()over(order by [A]) as ID, [A] as [Наименование], [B] as [Форма], [C]  as [Номер]
    FROM @t where [A]<>'Наименование') AS p
UNPIVOT
    (Value FOR Colname IN 
        ([Наименование], [Форма], [Номер])
)AS unpvt
GO
31 янв 14, 09:41    [15498383]     Ответить | Цитировать Сообщить модератору
 Re: Транспонирование таблицы  [new]
Lanselot
Member

Откуда:
Сообщений: 76
Спасибо. То что нужно!
3 фев 14, 13:50    [15510113]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить