【问题标题】:Return grouped multiple concatenated columns to a comma delimited string column将分组的多个连接列返回到逗号分隔的字符串列
【发布时间】:2017-04-30 05:04:44
【问题描述】:

我有下表

Year, Category,   CarID,  CarName,   Milage
--------------------------------------------
2012  GroupA       1     Porsche      100
2012  GroupA       2     Mercedes     200
2013  GroupA       3     Ferrari      300
2013  GroupB       4     Uno          200
2013  GroupB       5     Beetle       200

我想输出年份和类别的分组,并将汽车名称和里程作为显示列返回

Year, Category, DisplayString
--------------------------------------------
2012  GroupA    Mercedes (200km), Porsche (100km)  
2013  GroupA    Ferrari (300km)
2013  GroupB    Beetle (200km), Uno (200km)

我正在尝试将 a columns to comma delimited string 与 group by 以及连接的多个类型列组合,但我不确定如何继续。我正在使用 SQL Server 2012。

【问题讨论】:

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


    【解决方案1】:
    Select A.*
          ,DistplayString = (Select Stuff((Select Distinct concat(', ',CarName,' (',Milage,'km)') 
                                            From  YourTable 
                                            Where Year=A.Year and Category=A.Category 
                                            For XML Path ('')),1,2,'') )
     From (Select Distinct Year, Category From YourTable) A
    

    返回(感谢 Alan 的表变量 +1)

    Year    Category    DistplayString
    2012    GroupA      Mercedes (200km), Porsche (100km)
    2013    GroupA      Ferrari (300km)
    2013    GroupB      Beetle (200km), Uno (200km)
    

    【讨论】:

      【解决方案2】:

      约翰打败了我。这与引擎盖下的解决方案几乎相同。

      -- Your Sample Data
      DECLARE @yourtable TABLE 
      (
        [year]   smallint, 
        category varchar(10), 
        CarID    int, 
        CarName  varchar(20), 
        Milage   int
      );
      
      INSERT @yourtable
      VALUES 
      (2012,'GroupA',1,'Porsche',  100),
      (2012,'GroupA',2,'Mercedes', 200),
      (2013,'GroupA',3,'Ferrari',  300),
      (2013,'GroupB',4,'Uno',      200),
      (2013,'GroupB',5,'Beetle',   200);
      
      -- Solution
      SELECT 
        [Year], 
        Category, 
        DisplayString = 
        STUFF
        ((
          SELECT CONCAT(', ', Carname, ' (', milage, 'km)')
          FROM @yourtable i WHERE o.[year] = i.[year] AND o.category = i.category
          FOR XML PATH('')
        ),1,2,'')
      FROM @yourtable o
      GROUP BY [year], category;
      

      返回:

      Year   Category   DisplayString
      ------ ---------- ---------------------------------
      2012   GroupA     Porsche (100km), Mercedes (200km)
      2013   GroupA     Ferrari (300km)
      2013   GroupB     Uno (200km), Beetle (200km)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-13
        • 2012-12-22
        • 1970-01-01
        • 1970-01-01
        • 2017-04-10
        • 1970-01-01
        相关资源
        最近更新 更多