TSQL - устранение дубликатов из ResultSet и объединение их в один ряд - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть таблица с именем employee со следующими полями

Id | Name     | PrimaryEmail1  | PrimaryEmail2 | PrimaryEmail3
1  | JonSkeet | NULL           | NULL          | jonskeet@test.com
1  | JonSkeet | NULL           | Jon@test.com  | jonskeet@test.com
1  | JonSkeet | skeet@test.com | NULL          | jonskeet@test.com
2  | George   | G1@Test.com    | NULL          | NULL
2  | George   | NULL           | G2@test.com   | NULL
2  | George   | NULL           | NULL          | G3@test.com

Как написать запрос TSQL, чтобы я мог получить следующий набор результатов?

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

Ответы [ 2 ]

6 голосов
/ 01 февраля 2012

MAX исключит NULL

SELECT
   ID, Name, 
   MAX(PrimaryEmail1) AS PrimaryEmail1,
   MAX(PrimaryEmail2) AS PrimaryEmail2, 
   MAX(PrimaryEmail3) AS PrimaryEmail3
FROM
   employee 
GROUP BY
   ID, Name

Однако ваш пример для JonSkeet показывает, что PrimaryEmail3 такой же.Будете ли вы ожидать разные значения для идентификатора + имя?Если это так, вы не можете объединить в одну строку, если не выберете одну MAX (или даже четную MIN).

Это предполагает, что пары Id-Name тоже согласованы

0 голосов
/ 01 февраля 2012

Следующий скрипт объединит все отличные письма, отличные от 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       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...