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的要求输出结果