2015-02-09 260 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