Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
UNPIVOT или UNION |
23 дек 14, 12:28 [17039153] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Змей 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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Змей Member Откуда: Н.Новгород -> Москва Сообщений: 192 |
Wlr-l, 3 скана таблицы вместо одного? не айс:) |
23 дек 14, 15:25 [17040800] Ответить | Цитировать Сообщить модератору |
Wlr-l Member Откуда: Сообщений: 524 |
Змей, Конечно, не айс. И никто не говорит, что айс. Glory озвучил "UNPIVOT или UNION", поэтому привели варианты реализации. Более того, скажу, что Ваш вариант, скорее всего, самый быстрый. |
23 дек 14, 15:40 [17040918] Ответить | Цитировать Сообщить модератору |
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 | ![]() |