Объединить дубликаты записей в 1 поле - PullRequest
2 голосов
/ 09 февраля 2009

У меня есть таблица базы данных, которая содержит список контактов, некоторые из этих контактов могут иметь несколько записей, например,

CustomerID, CustomerName, Vehicle
1, Dan, Mazda
1, Dan, Suzuki
2, John, Ford
3, Dasha, Volvo
3, Dasha, Ford

Могу ли я написать запрос на выборку, чтобы получить разные customerID и CustomerName и список автомобилей в 1 записи? т.е.

1, Dan, Mazda+Suzuki
2, John, Ford
3, Dasha, Volvo+Ford

Спасибо

Ответы [ 3 ]

3 голосов
/ 09 февраля 2009

Есть несколько хороших ответов на эту проблему на другой вопрос .

Согласно связанной статье , это будет работать только в SQL Server 2005 и более поздних версиях из-за использования функций XML. Из статьи -

SELECT table_name, 
       LEFT(column_names,LEN(column_names) - 1)   AS column_names 
FROM   (SELECT table_name, 
               (SELECT column_name + ',' AS [text()] 
                FROM   information_schema.columns AS internal 
                WHERE  internal.table_name = table_names.table_name 
                FOR xml PATH ('') 
               ) AS column_names 
        FROM   (SELECT   table_name 
                FROM     information_schema.columns 
                GROUP BY table_name) AS table_names) AS pre_trimmed;

Вторая версия (правда, вдохновленная этот пост , на который я наткнулся после написание первой версии):

SELECT table_name, 
       LEFT(column_names,LEN(column_names) - 1)   AS column_names 
FROM   information_schema.columns AS extern 
       CROSS APPLY (SELECT column_name + ',' 
                    FROM   information_schema.columns AS intern 
                    WHERE  extern.table_name = intern.table_name 
                    FOR XML PATH('') 
                   ) pre_trimmed (column_names) 
GROUP BY table_name,column_names;

Вторая версия CROSS APPLY предположительно медленнее в соответствии с план выполнения, но я не проводил любые критерии вообще.

1 голос
/ 09 февраля 2009

Я не уверен, что это можно сделать с помощью одного sql. Однако в прошлый раз, когда я пытался сделать это в TSQL Sybase, я использовал временные таблицы и курсоры. Так что это можно сделать хотя бы по этому маршруту.

0 голосов
/ 09 февраля 2009

Я уверен, что вы не можете сделать это с помощью одного SQL-запроса.

Если это обычное требование, должна быть создана функция, которая вызывается для каждого идентификатора клиента.

SELECT   abc.CustomerID,
         dbo.udf_getCSVCustomerVehicles(abc.customerID)
FROM     (SELECT DISTINCT CustomerID
          FROM   TABLE) abc
ORDER BY abc.CustomerID

Затем просто создайте скалярную функцию, которая объединяет значения в переменную и возвращает результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...