Объединение 3 таблиц с помощью справочной таблицы, отображение результатов в colmns

#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
  

SQL скрипка