2017-03-03 78 views
0

我需要在Oracle SQL中組合多行,但無法訪問LISTAGG或wm_concat(禁用EVALUATE_AGGR)。如何在Oracle SQL中組合多行(有多個限制)

我目前使用一個可怕的黑客,這是否:

max(case when rank("table"."column" BY "table"."column2") = 1 then "table"."column" 
||max(case when rank("table"."column" BY "table"."column2") = 2 then "table"."column" 

如果我這樣做10次,然後我可以聚合前十行這大約是我所需要的。

有沒有更好的方法來做到這一點?也許使用子查詢?

注:我需要這個工作在Oracle OBIEE 11.1.1.9。

感謝任何幫助或提示。

+1

[各種技術顯示在這裏](https://oracle-base.com/articles/misc/string-aggregation-techniques)。 'sys_connect_by_path'可能是一個開始的地方,因爲你已經對它們進行了排名。 –

+0

謝謝。我已經看到這個,但LISTAGG,wm_concat和COLLECT沒有啓用,我沒有權限寫自己的函數。 好的:也許我可以讓sys_connect_by_path工作 – delica

+0

@delica這是要進入OBIEE的直接數據庫請求嗎?或者你將嘗試將其加入RPD中? –

回答

3

呃。我不喜歡把它寫成答案,但我發現Oracle-Base(請參閱Alex Poole的評論)和William Robertson的網站(引用Oracle-Base文章)中的解決方案並不完美,將不適合評論。

Oracle的基本環節:https://oracle-base.com/articles/misc/string-aggregation-techniques#row_number 威廉·羅伯遜網站:http://www.williamrobertson.net/documents/one-row.html

在甲骨文基本的解決方案使用兩個調用row_number()只需要一個時,它使用匯總查詢,而不是connect_by_isleaf。也許這是William最初發布的解決方案,但他的頁面目前有更好的解決方案,只需使用一個row_number()調用和connect_by_isleaf而不是聚合。

但是,在William的頁面上,他使用ltrim()而沒有顯示要修剪哪個字符的參數,所以實際上它沒有效果。並且他從row_number()的值中減去1,所以在結果中,每個逗號分隔列表中的第一個標記被省略。

這裏是更正的解決方案 - 供參考;我聲稱對此沒有任何獨創性。插圖在標準SCOTT模式的EMP表中運行。

select deptno 
    , ltrim(sys_connect_by_path(ename,','), ',') as name_list 
from (select deptno 
       , ename 
       , row_number() over (partition by deptno order by ename) as seq 
     from emp) 
where connect_by_isleaf = 1 
connect by seq = prior seq + 1 and deptno = prior deptno 
start with seq = 1; 

DEPTNO NAME_LIST 
------ ------------------------------------ 
10  CLARK,KING,MILLER 
20  ADAMS,FORD,JONES,SCOTT,SMITH 
30  ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD 
+0

好點。現在我檢查了一下,我在2004年寫道,我不知道'ltrim'或'-1'在那裏。 –

+0

@WilliamRobertson - 修復它永遠不會太晚!正如你所看到的,人們仍然會回到它(有一個很好的理由:當人們不能使用像LISTAGG這樣的更新工具時,這是正確的答案)。 – mathguy

+0

別擔心,我會複製你的版本:) –

相關問題