通过唯一标识符组合查询结果行?

时间:2012-02-27 21:58:57

标签: sql sql-server sql-server-2008 stored-procedures group-concat

我有一个查询,搜索几个表,并为其中一个查询表的一个特定列中的每个值返回一行。该表为一个唯一标识符返回多行。我想要做的是组合那些具有相同唯一标识符的行,并将列的值中的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 个答案:

答案 0 :(得分: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 :(得分:1)

根据this,您应该使用COALESCE

我首先将绘画和雕塑列合并为一个名为OneArt的列(在您的第一个查询中),然后在其上使用COALESCE和GROUP BY MuseumID。