Sql 逗号分隔两列
在SQL Server 2012表中,我希望将两列中的所有行转换为一行,仍然是两列,但每列都用逗号分隔 比如说Sql 逗号分隔两列,sql,sql-server,tsql,sql-server-2012,Sql,Sql Server,Tsql,Sql Server 2012,在SQL Server 2012表中,我希望将两列中的所有行转换为一行,仍然是两列,但每列都用逗号分隔 比如说 Customerid | FacilityId ----------------------------- 1 5678 2 9101 5 6543 然后,我希望结果是这样的 Customerid | FacilityId ------------
Customerid | FacilityId
-----------------------------
1 5678
2 9101
5 6543
然后,我希望结果是这样的
Customerid | FacilityId
-----------------------------
1,2,5 5678,9101,6543
您可以像这样对XML使用
查询
SELECT STUFF((
SELECT ',' + CONVERT(VARCHAR(10),Customerid)
FROM Customer
FOR XML PATH('')),1,1,'') as Customerid,
STUFF((
SELECT ',' + CONVERT(VARCHAR(10),FacilityId)
FROM Customer
FOR XML PATH('')),1,1,'') as FacilityId
输出
Customerid FacilityId
1,2,5 5678,9101,6543
编辑
您甚至可以使用变量将csv连接在一起,这不需要像XML的那样进行两次表扫描
,但是在同一查询中与ORDER BY
或其他函数一起使用时,可能会遇到问题
因为您只有3-4行,所以我建议使用forxml
方法
DECLARE @Customerid VARCHAR(MAX) = '',@FacilityId VARCHAR(MAX) = ''
SELECT
@Customerid += ',' + CONVERT(VARCHAR(10),Customerid),
@FacilityId += ',' + CONVERT(VARCHAR(10),FacilityId)
FROM Customer
SELECT STUFF(@Customerid,1,1,'') as Customerid, STUFF(@FacilityId,1,1,'') as FacilityId
您可以这样做:
SELECT * FROM
(SELECT Customerid = STUFF((
SELECT ',' + CAST(md.Customerid as varchar(max))
FROM dbo.TableName md
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, ''),
Facilityid=STUFF((
SELECT ',' + CAST(md.Facilityid as varchar(max))
FROM dbo.TableName md
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM dbo.TableName m
JOIN dbo.TableName s ON s.customerid = m.customerid AND s.facilityid=m.facilityid) as Tbl
GROUP BY customerid,facilityid
结果:
Customerid Facilityid
--------------------------
1,2,5 5678,9101,6543
SQL SERVER中的XML路径使用中的示例结果
SELECT (SELECT CAST(Customerid AS VARCHAR) + ',' from
Table for XML PATH(''), type).value('.', 'varchar(max)') AS Customerid,
(SELECT CAST(FacilityId AS VARCHAR) + ',' from
Table for XML PATH(''), type).value('.', 'varchar(max)') AS FacilityId
您可以使用STUFF
和FOR XML
来实现这一点:
CREATE TABLE #tmpDemo (CustomerId INT, FacilityId INT)
INSERT INTO #tmpDemo VALUES (1, 5678), (2, 9101), (5, 6543)
SELECT DISTINCT
STUFF((
SELECT ',' + CAST(T.CustomerId AS VARCHAR)
FROM #tmpDemo T
FOR XML PATH('')), 1, 1, '') as CustomerId,
STUFF((
SELECT ',' + CAST(T.FacilityId AS VARCHAR)
FROM #tmpDemo T
FOR XML PATH('')), 1, 1, '') as FacilityId
FROM #tmpDemo m
DROP TABLE #tmpDemo
这可能会在大型数据集上造成一些严重的性能问题,但我从您上面的评论中注意到,您将只拥有少数行。使用合并
DECLARE @Names VARCHAR(8000)
DECLARE @id VARCHAR(8000)
SELECT @id = COALESCE(@id + ', ', '') + CAST(col1 AS VARCHAR),@Names = COALESCE(@Names + ', ', '') + col2
FROM tab1
select @id,@Names
以下是一种简单快速的使用方法,它将从sqlserver 2012开始工作:
DECLARE @t table(Customerid int, FacilityId int)
INSERT @t values(1,5678),(2,9101),(5,6543)
DECLARE @x1 varchar(max), @x2 varchar(max)
SELECT
@x1 = concat(@x1 + ',', Customerid),
@x2 = concat(@x2 + ',', FacilityId)
FROM @t
SELECT @x1, @x2
您的桌子上可能有多少行?不多,最多可能有3或4行。绝对完美,非常棒。我没有意识到我可以像那样再加一点东西。每天学习新知识:)@stew STUFF是一个函数,它用一组新字符替换一些字符。在本例中,它将第一个字符替换为空varchar,这比我的答案更好!正如@Stew所说:每天都在学习新的东西Cheershope SQL Server获得了类似于group\u concat
或listag
的东西,更干净、更安全readable@t-clausen.dk删除STUFF
的好方法,我曾经使用ISNULL
,但是CONCAT
处理内部复杂的CONCAT方法处理空值。酷