Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 逗号分隔两列_Sql_Sql Server_Tsql_Sql Server 2012 - Fatal编程技术网

Sql 逗号分隔两列

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 ------------

在SQL Server 2012表中,我希望将两列中的所有行转换为一行,仍然是两列,但每列都用逗号分隔

比如说

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方法处理空值。酷