行列转换


用wmsys.wm_concat() 函数(NINGOO)
假如有如下表,其中各个i值对应的行数是不定的

SQL> select * from t;

I A D
———- ———- ——————-
1 b 2008-03-27 10:55:42
1 a 2008-03-27 10:55:46
1 d 2008-03-27 10:55:30
2 z 2008-03-27 10:55:55
2 t 2008-03-27 10:55:59
要获得如下结果,注意字符串需要按照D列的时间排序:

1 d,b,a
2 z,t

SQL> select i,wmsys.wm_concat(a)
2 from
3 (select * from t order by i,d)
4 group by i;

I WMSYS.WM_CONCAT(A)
———- ——————–
1 d,b,a
2 z,t
执行计划上看,只需要做一次表扫描就可以了,但是这个函数是加密过的,执行计划并不能显示函数内部的操作。

二、row_number()

SQL> Select a.*,row_number() over(Partition By Name Order By val) rn From a;

ID NAME VAL RN
———- ———- ———- ———-
1 aaa 30 1
2 aaa 40 2
3 aaa 60 3
4 bbb 40 1
5 bbb 60 2
6 bbb 80 3

6 rows selected.

SQL> select Name,sum(decode(tmp.rn,1,val)) val1,sum(decode(tmp.rn,2,val)) val2,sum(decode(tmp.rn,3,val)) val3 from (Select a.*,row_number() over(Partition By Name Order By val) rn From a)tmp Group By Name;

NAME VAL1 VAL2 VAL3
———- ———- ———- ———-
aaa 30 40 60
bbb 40 60 80



评论暂缺

(Required)
(Required, will not be published)