Объединение строк запрашиваемых результатов по уникальному идентификатору? - PullRequest
3 голосов
/ 28 февраля 2012

У меня есть запрос, который просматривает несколько таблиц и возвращает одну строку для каждого значения в одном конкретном столбце одной из запрашиваемых таблиц.Таблица возвращает несколько строк для одного уникального идентификатора.Я хочу объединить те строки, которые имеют одинаковый уникальный идентификатор, и объединить 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 #, уже отсортированную и объединенную.Я не хочу, я должен.Мне нужна помощь.

Кто-нибудь может помочь с этим?

Ответы [ 2 ]

3 голосов
/ 28 февраля 2012
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 голос
/ 28 февраля 2012

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

. Сначала я объединю столбцы Paintings и Sculptures в один столбец с именем OneArt (в вашем первом запросе), а затем использую COALESCE дляэто и GROUPID MuseumID.

...