SQL Server合并数据集

SQL Server合并数据集,sql,sql-server,coalesce,Sql,Sql Server,Coalesce,我有一个查询,返回的数据集如下所示: Region Name ------------------------------------------------------------- Canada Jim Canada Michael Canada Andy Mexico

我有一个查询,返回的数据集如下所示:

Region                           Name
-------------------------------------------------------------
Canada                           Jim 
Canada                           Michael
Canada                           Andy
Mexico                           Jim
Mexico                           Michael
Mexico                           Kevin
但我想把它换成这样:

Region                           Name
-------------------------------------------------------------
Canada, Mexico                   Jim
Canada, Mexico                   Michael
Canada                           Andy
Mexico                           Kevin
当名称相等时,我的游标查询尝试合并区域名称

OPEN RegionCursor

FETCH NEXT
FROM RegionCursor
INTO @regionNext
    ,@NameNext

SET @name = @NameNext;

WHILE @@FETCH_STATUS = 0
BEGIN
    IF @NameNext != @name
    BEGIN
        INSERT @RegionTable
        SELECT @region
            ,@name

        SELECT @region = @regionNext
            ,@name = @NameNext
    END
    ELSE
        SET @region = COALESCE(@region + ', ', SPACE(0)) + @regionNext;

    FETCH NEXT
    FROM RegionCursor
    INTO @regionNext
        ,@NameNext
END

INSERT @RegionTable
SELECT @region
    ,@name

CLOSE RegionCursor;

DEALLOCATE RegionCursor;

但是,当运行此操作时,它返回的原始数据集没有合并任何内容。我应该如何修改查询以返回所需的数据集?

您可以使用CTE,它可能更干净一些:

;WITH CTE AS
( SELECT Region,
         Name,
         rn = ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Name)
  FROM Table
)
SELECT c1.Region + ',' + c2.Region,
       c1.Name
FROM CTE c1
INNER JOIN CTE c2 ON c2.rn = c1.rn + 1

您可以使用CTE,它可能更干净一些:

;WITH CTE AS
( SELECT Region,
         Name,
         rn = ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Name)
  FROM Table
)
SELECT c1.Region + ',' + c2.Region,
       c1.Name
FROM CTE c1
INNER JOIN CTE c2 ON c2.rn = c1.rn + 1
您不需要使用XML路径技巧来实现这一点

SELECT Name,
       LEFT(cs.Region, Len(cs.Region) - 1) AS Region                           
FROM   Yourtable a
       CROSS APPLY (SELECT Region + ','
                    FROM   Yourtable B
                    WHERE  a.name = b.name
                    FOR XML PATH('')) cs (Region)
GROUP  BY Name,
          LEFT(cs.Region, Len(cs.Region) - 1) 
您不需要使用XML路径技巧来实现这一点

SELECT Name,
       LEFT(cs.Region, Len(cs.Region) - 1) AS Region                           
FROM   Yourtable a
       CROSS APPLY (SELECT Region + ','
                    FROM   Yourtable B
                    WHERE  a.name = b.name
                    FOR XML PATH('')) cs (Region)
GROUP  BY Name,
          LEFT(cs.Region, Len(cs.Region) - 1) 

是的,我不认为COALESCE做了你认为它做的事情。COALESCE是多个故障的ISNULL。你在找什么CONCATCOALESCE@region+',',SPACE0将返回带有逗号连接的@region或仅返回逗号本身。它永远不会返回空格0,因为在第一个参数中总是有非null的内容。也许您的意思是当@region不为NULL时,@region+,'END+@regionNext@JNevill这并不完全准确。如果@region为NULL:NULL+任何内容仍然为NULL是的,我不认为COALESCE做了您认为它做的事情。COALESCE是多个故障的ISNULL。你在找什么CONCATCOALESCE@region+',',SPACE0将返回带有逗号连接的@region或仅返回逗号本身。它永远不会返回空格0,因为在第一个参数中总是有非null的内容。也许您的意思是当@region不为NULL时,@region+,'END+@regionNext@JNevill这并不完全准确。如果@region为NULL:NULL+任何内容仍然为NULL投票,但当列名包含XML保留字符时,这可能会产生奇怪的结果。@BogdanSahlean-是的,这是真的。了解替代方法也很好。向上投票,但当列名包含XML保留字符时,这可能会产生奇怪的结果。@BogdanSahlean-是的,这是真的。了解备选方案也很好。它不会按照SOit的要求输出结果。它不会按照SO的要求输出结果