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

Откуда:
Сообщений: 2
в базе записаны сотрудники и ключи
у сотрудника может быть два ключа, ключи лежат в отдельной таблице
не могу вывести в отчет как ключ1 и ключ2
структура (картинка)
+
Картинка с другого сайта.

SELECT
  Employee.FirstName
 ,Employee.LastName
 ,AdditionalFieldStringValues.Value
 ,EmployeeGroup.Name
 ,Employee.SecondName
 ,AcsKey2EmployeeAssignment.AcsKeyId
FROM dbo.AdditionalFieldStringValues
INNER JOIN dbo.Employee
  ON AdditionalFieldStringValues.EmployeeId = Employee._id
INNER JOIN dbo.EmployeeGroup
  ON Employee.EmployeeGroupID = EmployeeGroup._id
INNER JOIN dbo.AcsKey2EmployeeAssignment
  ON AcsKey2EmployeeAssignment.EmployeeId = Employee._id
WHERE Employee.IsRemoved = 0
AND AcsKey2EmployeeAssignment.AssignmentModificationType = 0

Сейчас выводится так
+
Картинка с другого сайта.


Хотелось бы так
+
Картинка с другого сайта.


Заранее спасибо!
26 июл 18, 21:42    [21606312]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
invm
Member

Откуда: Москва
Сообщений: 9344
Вариант 1
SELECT
  Employee.FirstName
 ,Employee.LastName
 ,AdditionalFieldStringValues.Value
 ,EmployeeGroup.Name
 ,Employee.SecondName
 ,min(case when k.rn = 1 then k.AcsKeyId end) as AcsKeyId1
 ,min(case when k.rn = 2 then k.AcsKeyId end) as AcsKeyId2
FROM dbo.AdditionalFieldStringValues
INNER JOIN dbo.Employee
  ON AdditionalFieldStringValues.EmployeeId = Employee._id
INNER JOIN dbo.EmployeeGroup
  ON Employee.EmployeeGroupID = EmployeeGroup._id
outer apply (select top (2) AcsKeyId, row_number() over (order by (select 1)) from dbo.AcsKey2EmployeeAssignment where EmployeeId = Employee._id and AssignmentModificationType = 0) k(AcsKeyId, rn)
WHERE Employee.IsRemoved = 0
group by
  Employee.FirstName
 ,Employee.LastName
 ,AdditionalFieldStringValues.Value
 ,EmployeeGroup.Name
 ,Employee.SecondName

Вариант 2
SELECT
  Employee.FirstName
 ,Employee.LastName
 ,AdditionalFieldStringValues.Value
 ,EmployeeGroup.Name
 ,Employee.SecondName
 ,k1.AcsKeyId1
 ,k2.AcsKeyId2
FROM dbo.AdditionalFieldStringValues
INNER JOIN dbo.Employee
  ON AdditionalFieldStringValues.EmployeeId = Employee._id
INNER JOIN dbo.EmployeeGroup
  ON Employee.EmployeeGroupID = EmployeeGroup._id
outer apply (select top (1) AcsKeyId from dbo.AcsKey2EmployeeAssignment where EmployeeId = Employee._id and AssignmentModificationType = 0) k1(AcsKeyId1)
outer apply (select top (1) AcsKeyId from dbo.AcsKey2EmployeeAssignment where EmployeeId = Employee._id and AssignmentModificationType = 0 and AcsKeyId <> k1.AcsKeyId1) k2(AcsKeyId2)
WHERE Employee.IsRemoved = 0

Вариант 3
SELECT
  Employee.FirstName
 ,Employee.LastName
 ,AdditionalFieldStringValues.Value
 ,EmployeeGroup.Name
 ,Employee.SecondName
 ,k.x.value('key[1]/@AcsKeyId', 'int') as AcsKeyId1
 ,k.x.value('key[2]/@AcsKeyId', 'int') as AcsKeyId2
FROM dbo.AdditionalFieldStringValues
INNER JOIN dbo.Employee
  ON AdditionalFieldStringValues.EmployeeId = Employee._id
INNER JOIN dbo.EmployeeGroup
  ON Employee.EmployeeGroupID = EmployeeGroup._id
outer apply (select top (2) AcsKeyId as [@AcsKeyId] from dbo.AcsKey2EmployeeAssignment where EmployeeId = Employee._id and AssignmentModificationType = 0 for xml path('key'), type) k(x)
WHERE Employee.IsRemoved = 0
26 июл 18, 22:12    [21606385]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
tgrba
Member

Откуда:
Сообщений: 2
Огромное спасибо!!!
Картинка с другого сайта.
можно прикрыть тему
26 июл 18, 22:24    [21606419]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить