【问题标题】:Comma separate two separate columns逗号分隔两个单独的列
【发布时间】:2015-07-23 08:40:50
【问题描述】:

在 SQL Server 2012 表中,我想从两列中取出所有行并将它们转换为一行,仍然是两列,但每列以逗号分隔。

例如

Customerid    |    FacilityId
-----------------------------
1                    5678
2                    9101
5                    6543

然后id喜欢结果是这样的

Customerid    |    FacilityId
-----------------------------
1,2,5            5678,9101,6543

【问题讨论】:

  • 您的表中可能有多少行?
  • 不多,最多3个或4个。

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

你可以像这样使用FOR XMLSQL Fiddle

查询

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 连接在一起,这不需要像 FOR XML 这样的 2 次表扫描,但是在与 ORDER BY 或同一查询中的其他函数一起使用时可能会遇到问题。

由于您只有 3-4 行,我建议您使用 FOR XML 方法

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

【讨论】:

  • 绝对完美,很享受。我没有意识到我可以像那样添加第二个东西。每天学习新东西:)
  • @stew STUFF 是一个函数,它用一组新字符替换多个字符。在这种情况下,它将第一个字符替换为空 varchar
  • 比我的回答好!正如@Stew 所说:每天学习新东西。 ;) 干杯
  • 希望 SQL Server 获得类似于 group_concat 或 LISTAGG 的内容,这样更简洁、更易读
  • @t-clausen.dk 删除STUFF的好方法,我曾经使用ISNULL,但CONCAT在内部处理
【解决方案2】:

这是一种使用CONCAT 的简单快速的方法,它适用于 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

【讨论】:

  • 使用 CONCAT 处理 NULL 值的棘手方法。酷
【解决方案3】:

你可以这样做:

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 Fiddle 中的示例结果

【讨论】:

    【解决方案4】:

    在 SQL SERVER 中使用FOR XML PATH

    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
    

    【讨论】:

      【解决方案5】:

      您可以使用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
      

      这可能会在大型数据集上导致一些严重的性能问题,但我从您上面的评论中注意到,您只会有少数几行。

      【讨论】:

        【解决方案6】:

        使用COALESCE

        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
        

        SQLFiddle Demo

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-28
          相关资源
          最近更新 更多