#tsql #pivot #rows #transpose
#tsql #сводная #строки #транспонирование
Вопрос:
Это может быть совершенно очевидно, и я просто этого не вижу.
Пример данных здесь, на SQL fiddle
У меня есть 3 таблицы Experience, Contacts и Lookup.
Таблица поиска объединяет экспертные знания с соответствующими контактами (1 экспертный опыт для нескольких контактов)
В настоящее время данные контактов находятся в строках, и мне нужно перенести их в столбцы (максимум 5 контактов на экспертизу).
Хотел использовать PIVOT, потому что я пытаюсь узнать, как это работает. Конечно, это может быть не лучшим решением этой проблемы, альтернативные предложения приветствуются.
Результат, который я ищу, будет примерно таким:
ExpertiseName |Name1 |Email1 |Name2 |Email2 etc...
Computer Graphics|Karl Henderson|karl@email.com |Kevin Foster|kevin@...
Robotics |Viginia Lee |virginia@email.com|Ruby Riviera|...
Спасибо за любую помощь.
Ответ №1:
Вы пытаетесь преобразовать несколько столбцов (имя и адрес электронной почты), что не так просто, как поворот только одного поля. Более простой способ получить искомые результаты — сделать что-то вроде этого:
select ExpertiseName,
MAX(case when seq = 1 then ContactName end) Name1,
MAX(case when seq = 1 then ContactEmail end) Email1,
MAX(case when seq = 2 then ContactName end) Name2,
MAX(case when seq = 2 then ContactEmail end) Email2,
MAX(case when seq = 3 then ContactName end) Name3,
MAX(case when seq = 3 then ContactEmail end) Email3,
MAX(case when seq = 4 then ContactName end) Name4,
MAX(case when seq = 4 then ContactEmail end) Email4,
MAX(case when seq = 5 then ContactName end) Name5,
MAX(case when seq = 5 then ContactEmail end) Email5
from
(
select ex.ExpertiseId,
ex.ExpertiseName, ContactName, ContactEmail,
ROW_NUMBER() over(PARTITION by ex.ExpertiseId order by ex.ExpertiseId) seq
from lookup lk
join Expertise ex on ex.ExpertiseId = lk.ExpertiseId
join Contacts ct on ct.ContactId = lk.ContactId
) SourceTable
group by ExpertiseName