Код (подготовка образца данных):
DECLARE @Emp TABLE
(
[EId] INT IDENTITY(1, 1)
, [FN] NVARCHAR(50)
, [LN] NVARCHAR(50)
) ;
DECLARE @EmpPhCont TABLE
(
[EId] INT
, [PhType] VARCHAR(10)
, [PhNum] VARCHAR(16)
, [PhExt] VARCHAR(10)
, [IsMain] BIT
, [CreatedOn] DATETIME
) ;
INSERT INTO @Emp
VALUES
( N'Emp1', N'Emp1' )
, ( N'Emp2', N'Emp2' )
, ( N'Emp3', N'Emp3' )
, ( N'Emp4', N'Emp4' )
, ( N'Emp5', N'Emp5' )
, ( N'Emp6', N'Emp5' ) ;
INSERT INTO @EmpPhCont
VALUES
( 1, 'Home', '111111111', NULL, 0, '2020-01-01 00:00:01' )
, ( 1, 'Mobile', '222222222', NULL, 1, '2020-01-01 00:00:02' )
, ( 1, 'Work', '333333333', NULL, 0, '2020-01-01 00:00:03' )
, ( 2, 'Work', '444444444', '567', 1, '2020-01-01 00:00:04' )
, ( 2, 'Mobile', '555555555', NULL, 0, '2020-01-01 00:00:05' )
, ( 2, 'Mobile', '454545454', NULL, 0, '2020-01-01 00:00:06' )
, ( 3, 'Home', '777777777', NULL, 0, '2020-01-01 00:00:07' )
, ( 3, 'Mobile', '888888888', NULL, 1, '2020-01-01 00:00:08' )
, ( 3, 'Mobile', '12121212', NULL, 0, '2020-01-01 00:00:09' )
, ( 4, 'Work', '101010101', '111', 1, '2020-01-01 00:00:10' )
, ( 4, 'Work', '101010102', '232', 0, '2020-01-01 00:00:11' )
, ( 5, 'Work', '545454545', '456', 0, '2020-01-01 00:00:10' )
, ( 5, 'Work', '456456456', NULL, 1, '2020-01-01 00:00:11' ) ;
Описание:
@ Emp - образец таблицы сотрудников (уникальные записи сотрудников) ).
- EId = идентификатор сотрудника
- FN = имя
- LN = фамилия
@ EmpPhCont - образец сотрудника Таблица контактов телефона (каждая таблица Emp из таблицы @Emp может содержать ноль, один или несколько телефонных номеров - уникально по Emp / Type).
- PhType = тип телефона (домашний, мобильный, рабочий и т. Д. c)
- PhNum = номер телефона
- PhExt = добавочный номер телефона (в основном доступен для «Рабочий» PhType)
- IsMain = Это основной контактный номер. Каждый сотрудник с номером телефона будет иметь ровно 1 запись, помеченную как IsMain.
- CreatedOn = Дата создания записи
Цель:
Для вывода 1 записи на сотрудника со следующими столбцами
EId | HomeNum | MobileNum | WorkNum | WorkNumExt | MainPhType
Правила:
Возвращать все EId для всех записей из @Emp, независимо от того, имеют они запись @EmpPhCont или нет.
Для каждого emp, у которого есть доступ к записи @EmpPhCont, вернуть самые новые созданные PhNum и PhExt для соответствующего PhType, UNLESS более старая запись для того же Emp / PhType помечается как IsMain = 1 (Для любого emp для какой бы тип PhType, если IsMain = 1, всегда возвращает это значение PhNum и PhExt).
Ожидаемый результат:
EId HomeNum MobileNum WorkNum WorkNumExt MainPhType
1 111111111 222222222 333333333 NULL Mobile
2 NULL 454545454 444444444 567 Work
3 777777777 888888888 NULL NULL Mobile
4 NULL NULL 101010102 111 Work
5 NULL NULL 456456456 NULL Work
6 NULL NULL NULL NULL NULL
Моя неудачная попытка:
SELECT [EM].[EId]
, MAX ( IIF([PH].[PhType] = 'Home', [PH].[PhNum], NULL)) AS [HomePhNum]
, MAX ( IIF([PH].[PhType] = 'Mobile', [PH].[PhNum], NULL)) AS [MobilePhNum]
, MAX ( IIF([PH].[PhType] = 'Work', [PH].[PhNum], NULL)) AS [WorkPhNum]
FROM @Emp AS [EM]
LEFT JOIN @EmpPhCont AS [PH]
ON [EM].[EId] = [PH].[EId]
GROUP BY [EM].[EId] ;