【问题标题】:How to merge multiple rows in one single column field with given condition in SQL SERVER 2008 [duplicate]如何在 SQL SERVER 2008 中以给定条件合并单个列字段中的多行 [重复]
【发布时间】:2013-08-20 21:12:02
【问题描述】:

我使用的是 SQL Server 2008,我需要实现这个 :-> 我得到这样的结果:

表:-sql 查询 ....................

 acc_no           name
   001-000001       John
   001-000001       Bob
   001-000001       James
   001-000002       Sam
   001-000002       Bin 
   001-000002       Dus

所以,条件是;多人可以有相同的acc_no。所以我想要以下结果:

 acc_no           name
   001-000001       John,Bob,James
   001-000002       Sam,Bin,Dus

显示结果还有其他条件,但我卡在显示这种格式。

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    怎么样

    DECLARE @Table TABLE(
            acc_no VARCHAR(50),
            name VARCHAR(50)
    )
    INSERT INTO @Table (acc_no,name) SELECT '001-000001', 'John'
    INSERT INTO @Table (acc_no,name) SELECT '001-000001', 'Bob'
    INSERT INTO @Table (acc_no,name) SELECT '001-000001', 'James'
    INSERT INTO @Table (acc_no,name) SELECT '001-000002', 'Sam'
    INSERT INTO @Table (acc_no,name) SELECT '001-000002', 'Bin'
    INSERT INTO @Table (acc_no,name) SELECT '001-000002', 'Dus'
    
    --Concat
    SELECT  t.acc_no,
            stuff(
                    (
                        select  ',' + t1.name
                        from    @Table t1
                        where   t1.acc_no = t.acc_no
                        order by t1.name
                        for xml path('')
                    ),1,1,'') Concats
    FROM    @Table t
    GROUP BY t.acc_no
    

    SQL Fiddle DEMO

    【讨论】:

      【解决方案2】:

      试试这个 -

      DECLARE @temp TABLE
      (
            ID VARCHAR(20)
          , Name VARCHAR(50)
      )
      
      INSERT INTO @temp (ID, Name)
      VALUES 
          ('001-000001', 'John'),
          ('001-000001', 'Bob'),
          ('001-000001', 'James'),
          ('001-000002', 'Sam'),
          ('001-000002', 'Bin'),
          ('001-000002', 'Dus')
      
      SELECT t.ID, STUFF((
          SELECT ', ' + t2.Name
          FROM @temp t2
          WHERE t.ID = t2.ID
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '')
      FROM (
          SELECT DISTINCT ID 
          FROM @temp
      ) t
      

      输出 -

      ID                   
      -------------------- -------------------
      001-000001           John, Bob, James
      001-000002           Sam, Bin, Dus
      

      【讨论】:

        【解决方案3】:
         select acc_no,stuff((SELECT distinct ', ' + cast(name as varchar(10))
               FROM yourtable t2
               where t2.acc_no = t1.acc_no
               FOR XML PATH('')),1,1,'') 
               from yourtable t1
               group by acc_no
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-08
          • 2016-11-29
          • 2012-12-18
          • 2021-10-15
          • 2011-01-31
          • 2012-08-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多