#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), вы можете использовать следующий метод:
- Получите внутреннее соединение в качестве базовых данных для окончательного запроса
- Сгенерируйте номер строки для супервизоров
- Сделайте его горизонтальным с помощью некоторого дополнительного выбора (который будет выполняться достаточно быстро, если вы предварительно отфильтруете запрос 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), но для запуска сервера требуется больше усилий, и его сложнее обрабатывать во внешнем интерфейсе из-за изменения количества столбцов.