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

Откуда:
Сообщений: 450
Доброго времени суток!
Имеется таблица с ценами на товар по разным прайс-листам:
create table pricelists (id_goods int, pricelist1 money, pricelist2 money, pricelist3 money )


требуется развернуть таблицу так, чтобы для каждого товара в новой таблице было столько строк, сколько колонок с прайсами в старой таблице
получится должна такая таблица:

create table new_pricelists (id_goods int, pricelist int, price money )
23 дек 14, 12:26    [17039127]     Ответить | Цитировать Сообщить модератору
 Re: перевернуть таблицу - значения колонок в строки  [new]
Glory
Member

Откуда:
Сообщений: 104751
UNPIVOT или UNION
23 дек 14, 12:28    [17039153]     Ответить | Цитировать Сообщить модератору
 Re: перевернуть таблицу - значения колонок в строки  [new]
Volodya
Member

Откуда:
Сообщений: 450
спасибо, Glory

может кому пригодится результат
create table tmps (goods int, pricelist1 money, pricelist2 money, pricelist3 money)
insert tmps values (1, 10, 20, 30)
insert tmps values (2, 120, 220, 320)
insert tmps values (3, 130, 230, 330)
select * from tmps 

select goods, pricelist, price from tmps  UNPIVOT (price for pricelist in (pricelist1 , pricelist2 , pricelist3)) up
drop table tmps 
23 дек 14, 12:59    [17039407]     Ответить | Цитировать Сообщить модератору
 Re: перевернуть таблицу - значения колонок в строки  [new]
Wlr-l
Member

Откуда:
Сообщений: 524
"Так тренировки ради" UNPIVOT без ключевого слова UNPIVOT:
create table tmps (goods int, pricelist1 money, pricelist2 money, pricelist3 money)
insert tmps values (1, 10, 20, 30)
insert tmps values (2, 120, 220, 320)
insert tmps values (3, 130, 230, 330)
--select * from tmps 

select goods, pricelist, price from tmps  UNPIVOT (price for pricelist in (pricelist1 , pricelist2 , pricelist3)) up
--drop table tmps

;
with A as (
  select * from (values('pricelist1'),('pricelist2'),('pricelist3')) as T (pricelist)
)
, B as (
  select * from tmps cross join A
)
select goods, pricelist
      ,case pricelist 
         when 'pricelist1' then pricelist1
         when 'pricelist2' then pricelist2
         when 'pricelist3' then pricelist3
       end
 from B;

drop table tmps;
23 дек 14, 14:39    [17040298]     Ответить | Цитировать Сообщить модератору
 Re: перевернуть таблицу - значения колонок в строки  [new]
Змей
Member

Откуда: Н.Новгород -> Москва
Сообщений: 192
Ну еще можно попользовать
CROSS APPLY

select t.goods, x.pricelist, x.price 
from tmps t
cross apply(
  select 'pricelist1',t.pricelist1 union all 
  select 'pricelist2',t.pricelist2 union all
  select 'pricelist3',t.pricelist3
) x (pricelist, price)
23 дек 14, 14:53    [17040460]     Ответить | Цитировать Сообщить модератору
 Re: перевернуть таблицу - значения колонок в строки  [new]
Wlr-l
Member

Откуда:
Сообщений: 524
только одиними unionами:
select goods,'pricelist1',pricelist1 from tmps union all 
select goods,'pricelist2',pricelist2 from tmps union all
select goods,'pricelist3',pricelist3 from tmps
23 дек 14, 15:17    [17040725]     Ответить | Цитировать Сообщить модератору
 Re: перевернуть таблицу - значения колонок в строки  [new]
Змей
Member

Откуда: Н.Новгород -> Москва
Сообщений: 192
Wlr-l,

3 скана таблицы вместо одного? не айс:)
23 дек 14, 15:25    [17040800]     Ответить | Цитировать Сообщить модератору
 Re: перевернуть таблицу - значения колонок в строки  [new]
Wlr-l
Member

Откуда:
Сообщений: 524
Змей, Конечно, не айс. И никто не говорит, что айс.

Glory озвучил "UNPIVOT или UNION", поэтому привели варианты реализации.

Более того, скажу, что Ваш вариант, скорее всего, самый быстрый.
23 дек 14, 15:40    [17040918]     Ответить | Цитировать Сообщить модератору
 Re: перевернуть таблицу - значения колонок в строки  [new]
Volodya
Member

Откуда:
Сообщений: 450
я использую вариант с UNPIVOT и вот что получается:
 select price, 1, goods, (case when pricelist = 'pricelist1' then (select COL1 from #T_PriceHeads) 
								when pricelist = 'pricelist2' then (select COL2 from #T_PriceHeads) 
								else		(select COL3 from #T_PriceHeads)	end) t 
				from tmps
				UNPIVOT (price for pricelist in (pricelist1, pricelist2, pricelist3)) up
				where price > 0


Прошу обратить внимание на кусок:
(case when pricelist = 'pricelist1' then (select COL1 from #T_PriceHeads) 
								when pricelist = 'pricelist2' then (select COL2 from #T_PriceHeads) 
								else		(select COL3 from #T_PriceHeads)	end) t 


в выборку добавляется поле из другой слабо связанной с первой таблицей - связка организационная соответствие колонок по порядку их следования
Колонок прайсов более 100 и этот кусок должен разростись очень сильно. Можно как то лаконично связать таблицы для получения в выборку значения поля из таблицы #T_PriceHeads?
24 дек 14, 11:39    [17044657]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить