2015-02-09 367 views
0

我使用的是带有许多列的LISTAGGlistagg - 按列分组的多个组

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

有没有更简单的方法来做到这一点?

像'所有减去listagg ...'的组?

+0

你有可能发布一些示例代码? – 2015-02-10 01:39:19

+1

没有更整洁的方式。您必须列出GROUP BY子句中的所有列(除了常量,聚合和一些表达式之外)。 – 2015-02-10 07:03:37

回答

0

您是否有示例表?你在加入桌子吗?本示例使用连接,但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

+0

我希望能够解释我的答案的人解释推理。我几乎没有使用Oracle SQL的经验,但是我的答案出现了,因为我在GROUP BY语句中使用了LISTAGG,而没有使用这些列。我没有任何示例代码,所以我给了它最好的拍摄。任何有关为什么将有助于未来参考的信息。谢谢。 – 2015-02-10 12:58:19

+0

谢谢,我解决了你的问题。 – trogne 2015-02-10 14:26:08

+0

我降低了投票率。你的SQL没有什么特别的错误,但是它没有回答这个问题。 – 2015-02-11 04:47:23