wm_concat在行轉列的時候非常有用,但在行轉列的過程中的排序問題常常難以控制。
可見下面例子:
準備測試表:
drop table t;
create table t (n number,m number);
insert into t values(1,1);
insert into t values(5,3);
insert into t values(3,3);
insert into t values(6,5);
insert into t values(7,2);
insert into t values(2,2);
insert into t values(0,1);
insert into t values(11,1);
insert into t values(15,3);
insert into t values(13,3);
insert into t values(16,5);
insert into t values(17,2);
insert into t values(12,2);
insert into t values(10,1);
commit;
sql> select * from t order by 2,1;
n m———- ———-
0 11 1
10 1
11 1
2 27 2
12 2
17 2
3 35 3
13 3
15 3
6 516 5
測試wm_concat後的順序:
測試1:
sql> select m,wm_concat(n) from t group by m;
m wm_concat(n)
———- ——————————————————————————–
1 11,0,1,10
2 17,2,7,12
3 15,3,5,13
5 16,6
可見wm_concat後的順序並沒有按大->小,或小->大的順序。
測試2:
–參考網上一些解決思路
sql> select m,wm_concat(n)
2 from (select n,m from t order by m,n )
3 group by m;
m wm_concat(n)
———- ——————————————————————————–
1 0,11,10,1
2 2,17,12,7
3 3,15,13,5
5 6,16
可見順序問題還是沒有解決
最終解決思路:
sql> select m, max(r)
2 from (select m, wm_concat(n) over (partition by m order by n) r from t)
3 group by m ;
m max(r)
———- ——————————————————————————–
1 0,1,10,11
2 2,7,12,17
3 3,5,13,15
5 6,16
wm concat函式用法
在日常的資料查詢過程中,經常遇到一條資訊分多條記錄儲存,並以同乙個id關聯的情況,比如常見的房產證權利人資訊,因為共有權人可能有很多,不可能把所有的權利人都放到權利人表的權利人欄位,把所有權利人的證件號都放到權利人證件號字段,所以在資料庫設計時候,會採用乙個權利人一條記錄,並以權利id關聯的方式存放...
Oracle中的wm concat 函式
博主最近在學習使用oracle,前幾天寫 的時候有乙個任務,查詢到某一列的合併資料並且要求不能相同,我在網上查了查原來可以使用wm concat 這個函式來實現。一 wm concat 函式是oracle中獨有的,mysql中有乙個group concat 函式。這兩個函式的作用是相同的,它們的功能...
Oracle建立WM CONCAT函式
oracle建立wm concat函式 wm concat這個函式會出錯,所以從 11g開始。官方不認可 wm concat.然後就沒這個函式了,下面就是建立wm concat這個函式的步驟 用sqlplus登入 conn sys pass word as sysdba 一 忘記除sys syste...