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

[Concatenate grouped rows]的可能重复(http://stackoverflow.com/questions/9139472/concatenate-grouped-rows) – Tony 2012-02-27 22:06:16

回答

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。