【问题标题】:GROUP BY but get all values from other columnGROUP BY 但从其他列获取所有值
【发布时间】:2013-09-20 06:22:19
【问题描述】:

我将在示例中解释我需要做什么。首先,我们有一个像这样的简单表,命名为 table

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

现在查询:

SELECT t.* FROM table t GROUP BY t.id

我们会得到类似的结果:

id | name
===+=====
1  | foo
2  | foo

但是是否有可能收集 name 的所有值以获得这样的结果?

id | name
===+=================
1  | foo, bar, foobar
2  | foo, bar, foobar

【问题讨论】:

  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?
  • 您使用的是哪个 RDBMS? MySQL、SQL Server?
  • @a_horse_with_no_name, asstander:DBMS 并不重要,比如说 MySQL 和 PG。
  • DBMS 确实很重要。解决方案会有所不同。
  • 我猜,对于 Oracle 来说,我会使用 LISTAGG()

标签: sql group-by


【解决方案1】:

使用 MySQL 你可以使用GROUP_CONCAT(expr)

此函数返回一个字符串结果,其中包含连接的非 NULL 来自一个组的值。如果没有非 NULL 值,则返回 NULL。 完整的语法如下:

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

类似

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

SQL Fiddle DEMO

【讨论】:

    【解决方案2】:

    对于 SQL Server(之前 2017)使用FOR XML 子句和STUFF() 函数:

    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;
    

    更新

    使用 SQL Server 2017,您可以简单地使用 STRING_AGG() 函数来实现:

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

    this SQLFiddle

    【讨论】:

      【解决方案3】:

      对于 Postgres,请使用 string_agg()

      select id, 
             string_agg(name, ',' order by name) as name_list
      from the_table
      group by id
      order by id;
      

      【讨论】:

      【解决方案4】:

      如果您使用的是 db2,则以下查询适用于您:

      SELECT DISTINCT id, LISTAGG(names, ',')
      FROM tb
      GROUP BY id;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-26
        • 1970-01-01
        • 2021-12-17
        • 1970-01-01
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多