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

Откуда:
Сообщений: 139
Подскажите пожалуйста. Есть вопрос, состоящий из двух частей.

Часть1.
Имеются такие таблицы:
Tab1
Id Name Field1 Field2 Field3
1 'Name1' null nullnull
2 'Name2'null nullnull


Tab2
Id Tab1Id FieldName Value
1 1 'Field1' 'Value1'
2 1 'Field2' 'Value2'
3 1 'Field3' 'Value4'
4 2 'Field1' 'Value1'
5 2 'Field2' 'Value2'
6 2 'Field3' 'Value3'


Нужно получить результат запроса
Tab1Id Field1 Field2 Field3
1 'Value1' 'Value2' 'Value4'
2 'Value1' 'Value2' 'Value3'


Часть2.
Полученные данные требуется залить в Tab1. Где уже добавлены столбцы Field1, Field2, Field3.

Т.е. просто решено удалить бесполезную таблицу Tab2, и все данные хранить в существующей Tab1. Изначально предполагалось, что количество типов будет различно, но в итоге их так и осталось строго 3 (Field1, Field2, Field3), в связи с чем удобней и проще все это хранить в одной таблице.

Похоже это очень простая задача, но видимо торможу под вечер уже :( и с Pivot очень давно не работал.
В частности не могу придумать как быть с тем, что Pivot требует агрегатной функции, а мне она не нужна. Мне нечего агрегировать - нужно лишь вывести все данные повернув их. И затем как составить запрос Update, который на основе этого результата проапдейтит первую таблицу.
19 янв 18, 19:10    [21121395]     Ответить | Цитировать Сообщить модератору
 Re: Ох уж этот Pivot (  [new]
Добрый Э - Эх
Guest
TsHeloWorlder,

Пивот делаешь для второй таблицы, с агрегацией , как надо. Результат джойнишь к первой. Апдейт можно сделать через мердж по условию совпадения
Не получается с пивотом - замени его на тройной джойн второй таблицы к первой...
19 янв 18, 19:16    [21121413]     Ответить | Цитировать Сообщить модератору
 Re: Ох уж этот Pivot (  [new]
Awaiter
Member

Откуда:
Сообщений: 114
можете помочь с пивотом ? в том и дело, что не могу врубится. как быть с тем, что требуется агрегатная функция, а мне она не нужна ?
20 янв 18, 00:11    [21121892]     Ответить | Цитировать Сообщить модератору
 Re: Ох уж этот Pivot (  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1066
Awaiter, если все равно как - max
20 янв 18, 09:09    [21122068]     Ответить | Цитировать Сообщить модератору
 Re: Ох уж этот Pivot (  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30821
TsHeloWorlder
Pivot требует агрегатной функции, а мне она не нужна. Мне нечего агрегировать - нужно лишь вывести все данные повернув их.
Это такое требование, страховка от неуникальных сочетаний, а то серверу совершенно непонятно, как тогда выводить.
Поэтому ставьте, например, MAX, получится то, что вам нужно получить.
20 янв 18, 11:03    [21122189]     Ответить | Цитировать Сообщить модератору
 Re: Ох уж этот Pivot (  [new]
Awaiter
Member

Откуда:
Сообщений: 114
Можете сам запрос пивотный дать ?
21 янв 18, 00:11    [21123794]     Ответить | Цитировать Сообщить модератору
 Re: Ох уж этот Pivot (  [new]
Massa52
Member

Откуда:
Сообщений: 373
Awaiter,
DECLARE @t2 AS TABLE(Id int,	Tab1Id int,	FieldName VARCHAR(10),	Value VARCHAR(10))
INSERT @t2 (Id,	Tab1Id,	FieldName,	Value) VALUES
(1,	1,	'Field1',	'Value1'),
(2,	1,	'Field2',	'Value2'),
(3,	1,	'Field3',	'Value4'),
(4,	2,	'Field1',	'Value1'),
(5,	2,	'Field2',	'Value2'),
(6,	2,	'Field3',	'Value3')

select *
from (
select Tab1Id, Value, FieldName 
from @t2 ) as t2 
pivot ( max(Value) for FieldName in (Field1,Field2,Field3)) as pvt


Tab1Id Field1 Field2 Field3
1 Value1 Value2 Value4
2 Value1 Value2 Value3
21 янв 18, 08:24    [21123969]     Ответить | Цитировать Сообщить модератору
 Re: Ох уж этот Pivot (  [new]
TsHeloWorlder
Member

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

Большое спасибо !
22 янв 18, 10:28    [21125561]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить