ОБЪЕДИНЕНИЕ SQL — выбор значений в неразделимые строки

#sql #sql-server #join #sql-server-2014

#sql #sql-сервер #Присоединиться #sql-server-2014

Вопрос:

Это трудно объяснить, но я выполняю внутреннее объединение для 2 таблиц, где значения во 2-й таблице создают новые строки вместо добавления значений в ту же строку, но вместо этого добавляют значения в столбцы.

Итак, мои результаты выглядят так:

  Employee 1 | Supervisor 1
 Employee 1 | Supervisor 2
 Employee 1 | Supervisor 3
  

Я хочу, чтобы результаты выглядели так

 Employee 1 | Supervisor 1 | Supervisor 2 | Supervisor 3`
  

Таким образом, я могу сформулировать свое WHERE предложение более конкретно

Это запрос, который я использую до сих пор

 SELECT HR.EMPLOYEE, HR_SUPERVISOR.Name
FROM data.dbo.HR
INNER JOIN data.dbo.HR_SUPERVISOR
ON HR.ID = hr_supervisor.ID
WHERE HR.EMPLOYEE IN
  (SELECT HR.EMPLOYEE FROM data.dbo.HR GROUP BY HR.EMPLOYEE HAVING COUNT(*) > 1) AND
  HR_SUPERVISOR.Name like '%Test%' 
  GROUP BY HR_SUPERVISOR.name, HR.EMPLOYEE
  ORDER BY HR.EMPLOYEE ASC
  

Комментарии:

1. Какую СУБД вы используете?

2. Стандарт SQL 2014 с Management Studio 2012

3. learn.microsoft.com/en-us/sql/t-sql/queries/…

4. хорошо, я совершенно новичок в сводных таблицах, поэтому для выяснения этого может потребоваться некоторое время, особенно с объединением.

5. Существует ли конечное число сотрудников / руководителей? Вы ожидаете, что максимум, скажем, сотрудник 5 / супервизор 5? Или это может быть любое число?

Ответ №1:

Если максимальное количество супервизоров невелико (1-10), вы можете использовать следующий метод:

  1. Получите внутреннее соединение в качестве базовых данных для окончательного запроса
  2. Сгенерируйте номер строки для супервизоров
  3. Сделайте его горизонтальным с помощью некоторого дополнительного выбора (который будет выполняться достаточно быстро, если вы предварительно отфильтруете запрос baseData с помощью предложения where)
 create view vw_Supervisors as
with baseData as 
(
    SELECT 
        HR.id id, 
        ROW_NUMBER() OVER (partition by HR.id order by HR_SUPERVISOR.Name asc) rowNo, 
        HR.EMPLOYEE employee, 
        HR_SUPERVISOR.Name supervisor 
    FROM HR INNER JOIN HR_SUPERVISOR ON HR.ID = hr_supervisor.ID
)
select 
    b.id,
    b.EMPLOYEE, 
    SUPERVISOR1=(select supervisor from baseData b1 where b1.id=b.id and rowNo=1), 
    SUPERVISOR2=(select supervisor from baseData b1 where b1.id=b.id and rowNo=2), 
    SUPERVISOR3=(select supervisor from baseData b1 where b1.id=b.id and rowNo=3),
    SUPERVISOR4=(select supervisor from baseData b1 where b1.id=b.id and rowNo=4),
    SUPERVISOR5=(select supervisor from baseData b1 where b1.id=b.id and rowNo=5)
from baseData b 
group by b.id, b.employee;

  

В случае большого количества возможных столбцов вы должны использовать способ XML, чтобы сделать его горизонтальным. вы можете найти примеры для этого (строки в столбцы t-sql), но для запуска сервера требуется больше усилий, и его сложнее обрабатывать во внешнем интерфейсе из-за изменения количества столбцов.