1. 程式人生 > >oracle實現多行合併為一行

oracle實現多行合併為一行

最近專案中有這麼一個需求,一個模組中有多個變數以及變數給定的基數值,查詢時需要將每個模組下所有的變數基數根據權重相同則組合為一組計算公式所需要的引數,下面直接來個栗子:

主要涉及到兩種聚合函式:

10g及以前版本: wm_concat(column_name) 這個函式支援distinct去重,Oracle11g/Oracle10.2.0.5之後,wmsys.wm_concat 返回的是Clob,之前返回的是Varchar2,這裡涉及到oracle的buffer cache和db block gets

11g及以後版本: listagg(column_name,',') within group (order by column_name) 這個只能自己巢狀去重,建議使用此函式


create table test2
(
t_id number,--主鍵
var_id number, --變數ID
model_name varchar2(20), --模組名稱
var_name varchar2(20), --變數名稱
base_value number, --基數
logo varchar2(20), --標籤
sorct number --權重分數
);

insert into test2 values(1,1,'A','var_1','0.2','年輕態',1);
insert into test2 values(2,1,'A','var_1','-0.15','中年態',2);
insert into test2 values(3,1,'A','var_1','0.5','老年態',3);
insert into test2 values(4,2,'A','var_2','-0.59','年輕態',1);
insert into test2 values(5,2,'A','var_2','1.30','中年態',2);
insert into test2 values(6,2,'A','var_2','2.10','老年態',3);
insert into test2 values(7,3,'B','var_3','-0.59','年輕態',1);
insert into test2 values(8,3,'B','var_3','1.30','中年態',2);
insert into test2 values(9,3,'B','var_3','2.10','老年態',3);
insert into test2 values(10,4,'B','var_4','-0.59','年輕態',1);
insert into test2 values(11,4,'B','var_4','1.30','中年態',2);
insert into test2 values(12,4,'B','var_4','2.10','老年態',3);

--可以實現各模組、各權重、不同間變數組合
 
select sorct ,model_name,listagg(base_value,',') within group (order by sorct) as columnname from test2 GROUP BY sorct,model_name;

--如果logo也需要返回的話,直接在查詢列和group by後新增上
select sorct,model_name,wm_concat(base_value) as columnname from test2 GROUP BY sorct,model_name;