【问题标题】:How can I sum strings in one column into one row in Microsoft SQL? Group by does not work since it is MSSQL如何在 Microsoft SQL 中将一列中的字符串加到一行中? Group by 不起作用,因为它是 MSSQL
【发布时间】:2017-12-07 06:57:25
【问题描述】:

例如,我们有一个三列表格

Column A |  Column B | Column C
-------------------------------
P1       |    10     |    A    
P1       |    20     |    B
P1       |    30     |    C
P2       |    30     |    D
P2       |    40     |    E

如何在 Microsoft SQL 中编写 SELECT 查询才能得到这种结果

Column A |     Column B      |   Column C
------------------------------------------
P1       |    10, 20, 30     |    A, B, C
P2       |    30, 40         |    D, E

【问题讨论】:

标签: sql sql-server database


【解决方案1】:

试试这个

CREATE TABLE #temp(ColumnA VARCHAR(10),ColumnB INT ,ColumnC VARCHAR(10))
--insert rows

SELECT t.[ColumnA] ,
         [ColumnB] = STUFF((SELECT  ','+cast([ColumnB] AS VARCHAR ) FROM  #Temp WHERE  [ColumnA]  = t.[ColumnA]  FOR XML PATH('')),1,1,''),
         [ColumnC] = STUFF((SELECT  ','+[ColumnC] FROM #Temp WHERE [ColumnA] = t.[ColumnA] FOR XML PATH('')),1,1,'')
FROM #Temp t
GROUP BY t.[ColumnA]

我测试一下

【讨论】:

    【解决方案2】:

    如果您运行的是 SQL Server 2017,则向 SQL 开发人员介绍的 T-SQL 增强功能包括 STRING_AGG string concatenation function

    您可以简单地使用以下 SELECT 语句将来自不同行的字符串值聚合为单个列值

    select
        ColumnA,
        string_agg(ColumnB,',') ColumnB,
        string_agg(ColumnC,',') ColumnC
    from TestTable1
    group by ColumnA
    

    【讨论】:

    • 我正在运行 Sql server 2014 :( 感谢您的提示。我会记住这一点
    【解决方案3】:

    你可以试试xml方法和stuff()函数

    select t.[Column A] ,
             [Column B] = 
                    stuff(
                           (select  ','+cast([Column B] as varchar) from <table> where [Column A]  = t.[Column A]  for xml path('')),
                           1,1,''),
             [Column C] = stuff(
                           (select  ','+[Column C] from <table> where [Column A] = t.[Column A] for xml path('')),
                           1,1,'')
    from <table> t
    group by t.[Column A]
    

    【讨论】:

      【解决方案4】:
      SELECT DISTINCT COLA,
            STUFF((select ', '+ColB from T1 AS B where A.ColA=B.ColA FOR XML PATH(''),Type).value('.','NVARCHAR(MAX)'),1,2,'') AS ColB,
            STUFF((select ', '+ColC from T1 AS B where A.ColA=B.ColA FOR XML PATH(''),Type).value('.','NVARCHAR(MAX)'),1,2,'') AS ColC
      
            FROM T1 A
      

      【讨论】:

        猜你喜欢
        • 2020-01-17
        • 1970-01-01
        • 2023-01-24
        • 2010-09-21
        • 2023-03-09
        • 1970-01-01
        • 2013-03-15
        • 1970-01-01
        • 2022-06-28
        相关资源
        最近更新 更多