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

Откуда:
Сообщений: 11
Здравствуйте, знатоки!

Не нашел подходящих вариантов решения своей задачи.
Опишу в кратце суть...
Есть функция возвращающая табличное значение вида:

id_______name
10_______O(I)
10_______RH(+)
10_______KK-
10_______dd

т.е. для одного "объекта" с id=10 есть несколько значений разных параметров, которые собраны в такую таблицу
Эта функция используется через OUTER APPLY в основном запросе

Select p.*,BParam.name
From Product p
outer apply Function(p.id) as BParam
Where p.id = 10

В результате выполнения запроса:
p.id____p.type____BParam.name
10_____AAA________O(I)
10_____AAA________RH(+)
10_____AAA________KK-
10_____AAA________dd

Можно ли как то преобразовать либо запрос, либо функцию??
Чтобы получить результат вида
id________type________name1________name2________name3________name4
10_______AAA_________O(I___________RH(+__________KK-__________dd

PIVOT не подходит, так как нечего "агрегировать", нужно просто развернуть таблицу.
6 июл 12, 21:33    [12831592]     Ответить | Цитировать Сообщить модератору
 Re: И снова разворот таблицы...  [new]
Glory
Member

Откуда:
Сообщений: 104760
kuarse
PIVOT не подходит, так как нечего "агрегировать", нужно просто развернуть таблицу.

Нечего агрегировать - это не повод не сипользовать агрегатную функцию, необходимую для pivot
6 июл 12, 21:38    [12831607]     Ответить | Цитировать Сообщить модератору
 Re: И снова разворот таблицы...  [new]
kuarse
Member

Откуда:
Сообщений: 11
Glory
kuarse
PIVOT не подходит, так как нечего "агрегировать", нужно просто развернуть таблицу.

Нечего агрегировать - это не повод не сипользовать агрегатную функцию, необходимую для pivot


а можно примерчик какой нить для наглядности?
11 июл 12, 20:41    [12853011]     Ответить | Цитировать Сообщить модератору
 Re: И снова разворот таблицы...  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
kuarse,
--drop table #dd			
create table #dd(id tinyint, type2 varchar(3), name varchar(5) )
insert into #dd(id, type2, name) values (10, 'AAA', 'sq')
insert into #dd(id, type2, name) values (10, 'AAA', 'syy')
insert into #dd(id, type2, name) values (10, 'AAA', 'se')
insert into #dd(id, type2, name) values (10, 'AAA', 'sd')	
insert into #dd(id, type2, name) values (11, 'AAВ', 'se')

-- исходные данные
select * from #dd		

-- результат
select id, type2, [1] as name1, [2] as name2,[3] as name3,[4] as name4
	from
	(select * , ROW_NUMBER() over(partition by id order by name) as aa  from #dd )AS T
	PIVOT
	( max(name) for aa IN ([1],[2],[3],[4]) ) as PivotTable

ссылка
11 июл 12, 22:57    [12853400]     Ответить | Цитировать Сообщить модератору
 Re: И снова разворот таблицы...  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Возникает вопрос, а задлянафига первоначальная таблица так выглядит, может в ней один раз развернуть эти колонки, чтоб не мучать сервер каждый раз их переворачивать?
12 июл 12, 00:41    [12853743]     Ответить | Цитировать Сообщить модератору
 Re: И снова разворот таблицы...  [new]
kuarse
Member

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

Делается это для увеличения скорости отчетов.
Общий смысл - получить все параметры одного объекта, которые вытаскиваются большим количеством join для каждого параметра, в одной таблице используя всего пару join. А потом "вытянуть" их в линию и один раз получив все - брать нужный в каждый момент времени.

Но теперь идея с переворачиванием с помощью PIVOTA возможно будет заменена на "Таблица->XML->Выбор нужного поля(атрибута)" с помощью "FOR XML..." и "@xml.value ('xxx','yyy')
22 июл 12, 22:15    [12899569]     Ответить | Цитировать Сообщить модератору
 Re: И снова разворот таблицы...  [new]
kuarse
Member

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

Спасибо за пример и ссылку.
22 июл 12, 22:16    [12899574]     Ответить | Цитировать Сообщить модератору
 Re: И снова разворот таблицы...  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
kuarse
Делается это для увеличения скорости отчетов.
Общий смысл - получить все параметры одного объекта, которые вытаскиваются большим количеством join для каждого параметра, в одной таблице используя всего пару join
Теперь если подумать, в чём же разница (с тем что я предлагал), вам станет неловко.
Или вы так шутите?

И как ещё один вариант, SPARCE
23 июл 12, 02:17    [12900160]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить