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

Откуда:
Сообщений: 3
Всем привет. У меня возникла задача, которую я не знаю, как решить. И не уверен, возможно ли.

Упрощенно:
Есть таблица Article_Person с полями ArticleID и PersonID, где ArticleID - ID книги, PersonID - ID автора книги и внешний ключ для таблицы Person. ArticleID - не уникальный ключ, у одной книги может быть несколько авторов.
И есть таблица Person с информацией об авторах, в ней есть поля PersonID и FullName.

Вот такой запрос:

select ap.ArticleID, p.PersonID, p.FullName
from Article_Person ap
join Person p on p.PersonID = ap.PersonID
where ap.ArticleID in
( '9921', '11122' )

Выдаёт вот такие данные:

9921	9286	Галина Н. Кравец 
9921 9287 Юрий Н. Кравец
9921 11432 и другие
11122 9969 Чарльз де Линт
11122 38629 Галина Викторовна Соловьёва

То есть у первой книги 3 автора, у второй - один.

Моя задача - сделать так, чтобы получить некое подобие Group By ap.ArticleID, но чтобы данные об авторах ( p.PersonID, p.FullName ) выстроить в отдельные столбцы справа от ID. То есть, чтобы получить вот это:

9921	9286	Галина Н. Кравец 	9287	Юрий Н. Кравец 	               11432	и другие 
11122 9969 Чарльз де Линт 38629 Галина Викторовна Соловьёва

Выходит, что в первой строке получается 7 столбцов, а во второй - 5. Для меньшего числа авторов правые столбцы просто останутся пустыми.

Мне не приходит в голову, как это можно сделать. Кто-нибудь может подсказать, в какую вообще сторону стоит посмотреть в этом случае?

Заранее спасибо.
17 апр 16, 20:21    [19069334]     Ответить | Цитировать Сообщить модератору
 Re: Выбор значений одного поля в разные столбцы  [new]
Vaskrol
Member

Откуда:
Сообщений: 3
Прошу прощения, я не вижу кнопки "Редактировать"

Вот тут:

Vaskrol
То есть у первой книги 3 автора, у второй - один.


у второй книги 2 автора, а не один.
17 апр 16, 20:24    [19069350]     Ответить | Цитировать Сообщить модератору
 Re: Выбор значений одного поля в разные столбцы  [new]
iljy
Member

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

Если можно взять некое максимальное число столбцов (3,5,7, 100 - не важно, главное. что фиксированное), то подойдет обычный ROW_NUMBER+PIVOT.
Если достаточно собрать всех авторов в одну строку через запятую, то можно обойтись подзапросом с FOR XML PATH.
Если же надо делать произвольное число полей, то только динамика, формировать тот же запрос, что и первом случае, но динамически собирая список в PIVOT.
17 апр 16, 20:31    [19069362]     Ответить | Цитировать Сообщить модератору
 Re: Выбор значений одного поля в разные столбцы  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
А зачем вам это нужно?
Осмелюсь предположить, что Вы решаете клиентскую задачу средствами сервера?
18 апр 16, 00:06    [19069846]     Ответить | Цитировать Сообщить модератору
 Re: Выбор значений одного поля в разные столбцы  [new]
Vaskrol
Member

Откуда:
Сообщений: 3
iljy
Если можно взять некое максимальное число столбцов (3,5,7, 100 - не важно, главное. что фиксированное), то подойдет обычный ROW_NUMBER+PIVOT.

Во! Это то, что нужно, большое спасибо. Максимальное число авторов ограничено тремя.

Mike_za
А зачем вам это нужно?
Осмелюсь предположить, что Вы решаете клиентскую задачу средствами сервера?

Да, вы правы. Сам бы я не стал бы заниматься таким идиотизмом.

И на всякий случай, для тех, кто придёт сюда из Гугла, привожу запрос, реализующий сабж. Я его сделал на другой БД, которая была под рукой в данный момент.

select VideoMaterialID, [1] as Episode1, [2] as Episode2, [3] as Episode3
from
(
select
OriginalName,
row_number() over (partition by VideoMaterialID order by OriginalName) num,
VideoMaterialID
from Episode
where VideoMaterialID in ( 100011, 100179 )
) as stbl
pivot
(
MIN(OriginalName) for num in ([1], [2], [3])
) as pvt
order by VideoMaterialID
18 апр 16, 12:12    [19071203]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить