2011-06-10 70 views
1

我有2列合併行到1

Input 
Col 1 ---- Col 2 
1  ---- aaaa 
1  ---- bbbb 
1  ---- cccc 
2  ---- dddd 
2  ---- eeee 
2  ---- ffff 
2  ---- gggg 

Output 

Col 1 ---- Col 2 
1  ---- aaaabbbbcccc 
2  ---- ddddeeeeffffgggg 

我想這樣做的幾個自我加入了一個表,但似乎並不高效。任何有關如何寫入SQL的想法?

+3

的可能重複的[SSIS:甲骨文多行一個輸出,而不STRAGG](http://stackoverflow.com/questions/2104527/ssis-oracle-multiple-rows-to-one-column- output-without-stragg)等 – DCookie 2011-06-10 14:54:36

+0

不應該關閉。以上重複與歸一化形式很少複雜。 – NAVEED 2011-06-10 14:57:16

+3

爲什麼最近所有的零散問題?每個人都在同一個班級或什麼東西? :-) – tbone 2011-06-10 15:58:52

回答

1

好的,我會咬人的。相反stragg,儘量LISTAGG(11.2):

create table tst1 
(
pid number, 
val varchar2(10) 
); 


insert into tst1 values(1, 'Rec1'); 
insert into tst1 values(1, 'Rec2'); 
insert into tst1 values(1, 'Rec3'); 
insert into tst1 values(2, 'Rec1'); 
insert into tst1 values(2, 'Rec2'); 
commit; 


select pid, listagg(val, ':') within group(order by val) as "The List" 
from tst1 
group by pid; 

,你會得到:

pid The List 
1  Rec1:Rec2:Rec3 
2  Rec1:Rec2 

如果通過更改 「以便通過VAL遞減」 的順序,你會得到

pid The List 
1  Rec3:Rec2:Rec1 
2  Rec2:Rec1 
+0

在我認爲這個重複的問題中接受的答案有一個鏈接到一個頁面,其中有許多可能的解決方案來解決這個問題。 11g中的LISTAGG就是其中之一。此外,鏈接是爲了做到這一點*沒有* STRAGG。 – DCookie 2011-06-10 17:59:19

+0

好的,這是一個很好的鏈接,謝謝@DCookie! – tbone 2011-06-10 18:02:32

+0

最受歡迎。你對LISTAGG的觀點當然有效! – DCookie 2011-06-10 18:03:25

0

這是一個可以在Oracle 9i及更高版本中工作的版本

create table foo (
    key_column number, 
    val_column varchar2(4) 
); 

insert into foo values (1, 'aaaa'); 
insert into foo values (1, 'bbbb'); 
insert into foo values (1, 'cccc'); 
insert into foo values (2, 'dddd'); 
insert into foo values (2, 'eeee'); 
insert into foo values (2, 'ffff'); 
insert into foo values (2, 'gggg'); 


    select key_column 
     , replace(max(sys_connect_by_path(val_column, ',')), ',') combined 
     from (select key_column 
       , val_column 
       , row_number() over (partition by key_column order by val_column) cur 
       , row_number() over (partition by key_column order by val_column) - 1 prev 
       from foo) foo 
    group by key_column 
connect by prior cur = prev and prior key_column = key_column 
start with cur = 1; 

    key_column | val_column 
    -------------------------- 
      1 | aaaabbbbcccc 
      2 | ddddeeeeffffgggg