【问题标题】:Concatenate Column A depending on Value of Column B - SQL Server [duplicate]根据列 B 的值连接列 A - SQL Server [重复]
【发布时间】:2016-06-22 17:06:15
【问题描述】:
I have a table that looks like the following


COLUMN_A|| COLUMN_B ||
======================
NAME1   ||    1     ||
NAME2   ||    1     ||
NAME3   ||    1     ||  
NAME4   ||    2     ||  
NAME5   ||    2     ||  
NAME6   ||    3     ||
NAME7   ||    3     ||  

我想根据 COLUMN_B 连接 COLUMN_A。 如果 COLUMN_B 的值相同,则 COLUMN_A 应以逗号分隔。

预期结果

NAME1, NAME2, NAME3
NAME4, NAME5
NAME6, NAME7

【问题讨论】:

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


    【解决方案1】:
    Declare @Table table (id int,Name varchar(25))
    Insert Into @Table values 
    (1,'NAME1'),
    (1,'NAME2'),
    (1,'NAME3'),
    (2,'NAME4'),
    (2,'NAME5'),
    (3,'NAME6'),
    (3,'NAME7')
    
    
    
    SELECT 
      [ID],
      STUFF((
        SELECT ', ' + NAME 
        FROM @Table
        WHERE (ID = Results.ID) 
        FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
      ,1,2,'') AS NAME
    FROM @Table Results
    GROUP BY ID
    

    返回

    ID  NAME
    1   NAME1, NAME2, NAME3
    2   NAME4, NAME5
    3   NAME6, NAME7
    

    【讨论】:

      【解决方案2】:

      您可以使用递归来帮助解决此问题:

      CREATE TABLE #Temp(ColumnA VARCHAR(50), ColumnB INT)
      
      INSERT INTO #Temp 
      VALUES('NAME1', 1)
      , ('NAME2', 1)
      , ('NAME3', 1)
      , ('NAME4', 2)
      , ('NAME5', 2)
      , ('NAME6', 3)
      , ('NAME7', 3)
      
      ;WITH Numbered 
      AS
      (
      SELECT ColumnA, ColumnB, ROW_NUMBER() OVER (PARTITION BY ColumnB ORDER BY ColumnA) AS RowNum
      FROM #Temp 
      )
      ,RecordCounts
      AS
      (
      SELECT ColumnB, COUNT(1) AS RecordCount
      FROM #Temp
      GROUP BY ColumnB
      )
      ,RecursiveCTE
      AS
      (
      SELECT ColumnB, CONVERT(VARCHAR(50), ColumnA) AS ColumnA, RowNum
      FROM Numbered 
      WHERE RowNum = 1
      UNION ALL
      SELECT N.ColumnB, CONVERT(VARCHAR(50), R.ColumnA + ', ' + N.ColumnA), N.RowNum
      FROM RecursiveCTE R 
          INNER JOIN Numbered N ON R.ColumnB = N.ColumnB 
              AND N.RowNum = R.RowNum + 1
      )
      SELECT ColumnA 
      FROM RecursiveCTE R
      INNER JOIN RecordCounts RC ON R.ColumnB = RC.ColumnB
          AND R.RowNum = RC.RecordCount 
      ORDER BY R.ColumnB
      
      DROP TABLE #Temp
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-23
        • 2018-08-06
        • 2019-11-13
        • 2021-04-05
        • 1970-01-01
        • 2018-10-01
        • 2017-09-28
        相关资源
        最近更新 更多