3

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

Пример:

Museum  MuseumID  Country  City  Paintings  Sculptures 

Louvre  345   France  Paris Mona Lisa  NULL 
Louvre  345   France  Paris NULL   Venus De Milo 
Louvre  345   France  Paris Ship of Fools NULL 

Вместо этого я хотел бы сделать запрос это сделать:

Museum  MuseumID  Country  City  Art 
Louvre  345   France  Paris Mona Lisa, Venus De Milo, Ship of Fools 

Мне нужно, чтобы включить этот запрос в хранимую процедуру, которая может быть использована в C# программы. Сначала я просто взял данные как есть и использовал C# для объединения строк с использованием массивов и некоторой логики, но я должен сделать это хранимой процедурой, чтобы данные перешли на программу C#, уже отсортированную и объединенную. Я не хочу этого делать. Мне нужна помощь.

Может ли кто-нибудь помочь в этом?

+0

возможно дубликат [Конкатенируйте сгруппированные строки] (http://stackoverflow.com/questions/9139472/concatenate-grouped-rows) – Tony

ответ

3
DECLARE @a TABLE 
(
    Museum VARCHAR(32), 
    MuseumID INT, 
    Country VARCHAR(32), 
    City VARCHAR(32), 
    Paintings VARCHAR(32), 
    Sculptures VARCHAR(32) 
); 

INSERT @a VALUES 
('Louvre',345,'France','Paris', 'Mona Lisa',  NULL), 
('Louvre',345,'France','Paris', NULL,   'Venus De Milo'), 
('Louvre',345,'France','Paris', 'Ship of Fools', NULL); 


SELECT DISTINCT Museum, MuseumID, Country, City, 
    Art = STUFF((SELECT ', ' + COALESCE(Paintings, Sculptures, '') 
    FROM @a AS a2 
    WHERE a2.museum = a.museum AND a2.MuseumID = a.MuseumID 
    AND a2.Country = a.Country AND a2.City = a.City 
    FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)'), 
    1,2,'') 
FROM @a AS a; 
1

Согласно this, вы должны использовать COALESCE.

Я бы сначала объединил столбцы «Картины и скульптуры» в один столбец OneArt (в вашем первом запросе), затем используйте COALESCE на нем и GROUP BY MuseumID.

Смежные вопросы