GROUP BY but get all values from other column

后端 未结 3 1887
不思量自难忘°
不思量自难忘° 2020-12-13 17:33

I\'\'ll explain what I need to do on example. First of all, we have a simple table like this one, named table:

id | name
===+=====
1  | foo
1  | bar         


        
相关标签:
3条回答
  • 2020-12-13 18:08

    Using MySQL you can use GROUP_CONCAT(expr)

    This function returns a string result with the concatenated non-NULL values from a group. It returns NULL if there are no non-NULL values. The full syntax is as follows:

    GROUP_CONCAT([DISTINCT] expr [,expr ...]
                 [ORDER BY {unsigned_integer | col_name | expr}
                     [ASC | DESC] [,col_name ...]]
                 [SEPARATOR str_val])
    

    Something like

    SELECT ID, GROUP_CONCAT(name) GroupedName
    FROM Table1
    GROUP BY ID
    

    SQL Fiddle DEMO

    0 讨论(0)
  • 2020-12-13 18:08

    For Postgres use string_agg()

    select id, 
           string_agg(name, ',' order by name) as name_list
    from the_table
    group by id
    order by id;
    
    0 讨论(0)
  • 2020-12-13 18:21

    For SQL Server (before 2017) use FOR XML clause and STUFF() function for that:

    SELECT distinct id, name = 
        STUFF((SELECT ' , ' + name
               FROM Table1 b 
               WHERE b.id = a.id 
              FOR XML PATH('')), 1, 2, '')
    FROM Table1 a
    GROUP BY id;
    

    UPDATE

    With SQL Server 2017, you can simply use STRING_AGG() function to achieve that:

    SELECT ID, STRING_AGG (name, ', ') AS Name
    FROM Table1
    GROUP BY ID
    

    See this SQLFiddle

    0 讨论(0)
提交回复
热议问题