listagg - 多个按列分组

Posted

技术标签:

【中文标题】listagg - 多个按列分组【英文标题】:listagg - multiple group by columns 【发布时间】:2015-02-09 19:45:49 【问题描述】:

我使用LISTAGG 来处理很多列。

所以我必须做GROUP BY所有这些列。

有没有更整洁的方法来做到这一点?

喜欢 'group by all minus listagg...' ?

【问题讨论】:

你能发布一些示例代码吗? 没有更整洁的方式。您必须列出 GROUP BY 子句中的所有列(常量、聚合和一些表达式除外)。 【参考方案1】:

您有示例表吗?你在加入表格吗?此示例使用连接,但 LISTAGG 列不在 group by 语句中。

这是我为另一个我编辑的问题所做的示例。

SQL Fiddle

SELECT c.id,
   c.model,
   LISTAGG(d.name, ',')
     within GROUP (ORDER BY d.name)  AS "Drivers",
   LISTAGG(c.color, ',')
     within GROUP (ORDER BY c.color) AS "Colors"
FROM   TBLCARS c
   join TBLDRIVERS d
     ON c.id = d.fid_tblcars
GROUP  BY c.id,
      c.model
ORDER  BY c.id 

这是一个使用 WITH 子句的方法,您可以使用 CTE 并构建更大的查询。

WITH cte
 AS (SELECT c.id,
            LISTAGG(c.color, ',')
              within GROUP (ORDER BY c.color) AS "Colors",
            LISTAGG(c.model, ',')
              within GROUP (ORDER BY c.model) AS "Model",
            LISTAGG(d.name, ',')
              within GROUP (ORDER BY d.name)  AS "Name"
     FROM   TBLCARS c
            join TBLDRIVERS d
              ON c.id = d.fid_tblcars
     GROUP  BY c.id)
SELECT *
FROM   cte  

SQL FIDDLE WITH

【讨论】:

我希望拒绝我答案的人能解释原因。我对 Oracle SQL 的经验很少,但我的答案出现在轨道上,因为我使用 LISTAGG,而 GROUP BY 语句中没有这些列。我没有任何示例代码,所以我尽力而为。任何有关原因的信息都将有助于将来的参考。谢谢。 谢谢你的问题。 我投了反对票。您的 SQL 没有什么特别的问题,但它没有回答问题。

以上是关于listagg - 多个按列分组的主要内容,如果未能解决你的问题,请参考以下文章

使用 LISTAGG 获取值,但避免对内连接中使用的表进行分组

listagg小记录

listagg小记录

DB2-具有DISTINCT子句的LISTAGG()-不起作用?

oracle 10g怎么实现 listagg功能

oracle listagg的 截取长度限制有没有啥方法解决