Следующий скрипт объединит все отличные письма, отличные от NULL, в один список, отдельно для каждого столбца:
;
WITH employee (Id, Name, PrimaryEmail1, PrimaryEmail2, PrimaryEmail3) AS (
SELECT 1, 'JonSkeet', NULL , NULL , 'jonskeet@test.com' UNION ALL
SELECT 1, 'JonSkeet', NULL , 'Jon@test.com', 'jonskeet@test.com' UNION ALL
SELECT 1, 'JonSkeet', 'skeet@test.com', NULL , 'jonskeet@test.com' UNION ALL
SELECT 2, 'George' , 'G1@Test.com' , NULL , NULL UNION ALL
SELECT 2, 'George' , NULL , 'G2@test.com' , NULL UNION ALL
SELECT 2, 'George' , NULL , NULL , 'G3@test.com'
)
SELECT
Id,
Name,
PrimaryEmail1 = SUBSTRING(
(SELECT DISTINCT ', ' + PrimaryEmail1 FROM employee WHERE Id = e.Id FOR XML PATH ('')),
3,
999999
),
PrimaryEmail2 = SUBSTRING(
(SELECT DISTINCT ', ' + PrimaryEmail2 FROM employee WHERE Id = e.Id FOR XML PATH ('')),
3,
999999
),
PrimaryEmail3 = SUBSTRING(
(SELECT DISTINCT ', ' + PrimaryEmail3 FROM employee WHERE Id = e.Id FOR XML PATH ('')),
3,
999999
)
FROM employee e
GROUP BY Id, Name
Если в любом из трех * 1004 никогда не может быть разных значений, отличных от NULL.* столбцы для того же сотрудника, вы получите тот же результат, что и с MIN
или MAX
.В противном случае вы получите все значения в списке
Результаты для приведенного выше сценария:
Id Name PrimaryEmail1 PrimaryEmail2 PrimaryEmail3
-- -------- -------------- ------------- -----------------
1 JonSkeet skeet@test.com Jon@test.com jonskeet@test.com
2 George G1@Test.com G2@test.com G3@test.com