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

Откуда:
Сообщений: 88
Добрый день. Есть запрос который возвращает записи с некоторыми полями. Допустим поля id fio
idfio
1Вася

Есть вьюха с некоторыми атрибутами для этой записи. Допустим, запрос
select * from view v where v.id = 1
из нее по этому Id записи возвращает:
attribute_name attribute_value
Атрибут110
Атрибут220

Каким образом можно получить результирующий запрос в виде:
idfioАтрибут1 Атрибут2
1Вася1020

если количество записей, возвращаемое из вьюхи может меняться? Можно ли как-то под это приспособить PIVOT? И если да то как?

Вообще следуя этому примеру: http://hashcode.ru/questions/42644/sql-как-перевернуть-вывод-т-е-строки-сделать-столбцами

мне удалось сделать процедуру, которая генерируют динамический запрос и возвращает то, что мне как раз нужно. Вот для этого пример она вернет EXEC proc 1
idАтрибут1 Атрибут2
11020

Да вот только никак не могу придумать как мне прицепить ее к основному запросу. В табличную функцию ее засунуть не получилось. Может как вариант можно каким-то образом таки прицепить эту процедуру к основному селекту?
9 фев 15, 16:30    [17239587]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли тут PIVOT?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Тройка
Да вот только никак не могу придумать как мне прицепить ее к основному запросу.

К какому "основному" ?
Прсто вызывайте процедуру и получайте из нее нужный набор данных
9 фев 15, 16:33    [17239610]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли тут PIVOT?  [new]
Тройка
Member

Откуда:
Сообщений: 88
Glory
К какому "основному" ?
Прсто вызывайте процедуру и получайте из нее нужный набор данных


Да вот к тому, который возвращает
idfio
1Вася


Допустим, это возвращает запрос
select id, fio from table_name t where t = 1

Как я понимаю что бы получить что что мне надо, нужно записать что-то типа:
select id, fio, proc_table.*
from table_name t  
join (exec proc_name t.id) proc_table on t.id = proc_table.id
where t = 1


Да только так вызвать можно табличную функцию, но не обычную процедуру.

P.S. В основном приходится работать с ораклом, поэтому могу ошибаться
9 фев 15, 16:55    [17239764]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли тут PIVOT?  [new]
Glory
Member

Откуда:
Сообщений: 104751
У вас запрос сам себя запускает что ли ?
Или все таки какое-то клиентское приложение ?
9 фев 15, 16:57    [17239780]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли тут PIVOT?  [new]
Тройка
Member

Откуда:
Сообщений: 88
Glory
У вас запрос сам себя запускает что ли ?
Или все таки какое-то клиентское приложение ?

Клиентское приложение. Понятно что можно получить данные из "основного" запроса и для каждой строки дернуть уже на клиенте процедуру и дописать поля. Но если в "основном" запросе строк будет хотя бы пару тысяч, то столько же вызовов процедуры с клиента будет. Быть может как-то можно это все разрулить на серверной стороне?
9 фев 15, 17:08    [17239873]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли тут PIVOT?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Тройка
Клиентское приложение. Понятно что можно получить данные из "основного" запроса и для каждой строки дернуть уже на клиенте процедуру и дописать поля. Но если в "основном" запросе строк будет хотя бы пару тысяч, то столько же вызовов процедуры с клиента будет. Быть может как-то можно это все разрулить на серверной стороне?

Сразу "дернуть" процедуру не думали ? Один раз
9 фев 15, 17:09    [17239880]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли тут PIVOT?  [new]
Тройка
Member

Откуда:
Сообщений: 88
Glory
Сразу "дернуть" процедуру не думали ? Один раз

Ну, в принципе да, можно. Добавить в процедуру еще логику выборки списка id "основного" запроса и одним запросом выбрать данные для всех записей и уже на клиенте заджоинить каким-нибудь LINQ. Если по-другому никак - то сделаю таким образом
9 фев 15, 17:26    [17239987]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли тут PIVOT?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Тройка
Ну, в принципе да, можно. Добавить в процедуру еще логику выборки списка id "основного" запроса и одним запросом выбрать данные для всех записей и уже на клиенте заджоинить каким-нибудь LINQ. Если по-другому никак - то сделаю таким образом

Какой опять "на клиенте заджоинить " ?
Вы что не умеете писать процедуры, которые сразу возвращают нужный конечный результат ?
9 фев 15, 17:27    [17239994]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли тут PIVOT?  [new]
ответ к певому посту
Guest
Тройка,

1 результирующий набор хранимки можно сложить во временную таблицу или табличную переменную и спокойно джойнить на него что угодно

2 этого можно не делать если в запрос, используемый для пивота (вы же пивот динамически собираете, а не рукописный пивот сочиняете?), включить сразу эту таблицу. или вариации с подзапросами, но опять же джойнить внутри той proc1. встраивать exec в селект+джойн не нужно.

3 переворачивайте на клиенте. linq пока не видно. нужно-то скорее всего для визуализации (или упущен нюанс что у нескольких вась набор и количество атрибутов могут сильно отличаться и перевернутые все вместе они будут смотреться нелепо), а штуки визуализации частенько сами умеют переворачивать что нужно и как нужно. если конкретные не умеют и есть linq - то лучше не на сервере, т.к. серверу результат этой задачи по боку. но, опять же, если количество колонок изменчиво, то и поля ввода нужно генерить? разница, в колонках или в строках все это дело приходит, точно есть?
9 фев 15, 21:45    [17241003]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить