SQL的拼寫
--下面是些基礎數據
[email protected]> desc t
Name Null? Type
----------------------------------------------------- -------- -----------
COL1 VARCHAR2(3)
COL2 VARCHAR2(3)
COL3 VARCHAR2(3)
COL4 VARCHAR2(3)
[email protected]> select * from t;
COL COL COL COL
--- --- --- ---
A01 B01 C01 D01
A01 B02 C02 D02
A02 B03 C03 D03
A02 B04 C04 D04
A02 B05 C05 D05
A03 B06 C06 D06
6 rows selected.
--下面這部分實際上就是創建一個聚合函數sumc
[email protected]> create or replace type TypeSumVarchar as object
2 (
3 sum VARCHAR2(100),
4 static function ODCIAggregateInitialize(sctx IN OUT TypeSumVarchar)
5 return number,
6 member function ODCIAggregateIterate(self IN OUT TypeSumVarchar,
7 value IN varchar2) return number,
8 member function ODCIAggregateTerminate(self IN TypeSumVarchar,
9 returnValue OUT VARCHAR2, flags IN number) return number,
10 member function ODCIAggregateMerge(self IN OUT TypeSumVarchar,
11 ctx2 IN TypeSumVarchar) return number
12 );
13 /
Type created.
[email protected]> CREATE OR REPLACE TYPE BODY TYPESUMVARCHAR is
2 static function ODCIAggregateInitialize(sctx IN OUT TypeSumVarchar)
3 return number is
4 begin
5 sctx := TypeSumVarchar('');
6 return ODCIConst.Success;
7 end;
8
9 member function ODCIAggregateIterate(self IN OUT TypeSumVarchar, value IN VARCHAR2)
10 return number is
11 begin
12 self.sum:=self.sum||','||value;
13 return ODCIConst.Success;
14 end;
15
16 member function ODCIAggregateTerminate(self IN TypeSumVarchar, returnValue OUT
17 VARCHAR2, flags IN number) return number is
18 begin
19 returnValue := substr(self.sum,2);
20 return ODCIConst.Success;
21 end;
22
23 member function ODCIAggregateMerge(self IN OUT TypeSumVarchar, ctx2 IN
24 TypeSumVarchar) return number is
25 begin
26 return ODCIConst.Success;
27 end;
28 end;
29 /
Type body created.
[email protected]> CREATE OR REPLACE FUNCTION SUMC (input VARCHAR2) RETURN VARCHAR2
2 AGGREGATE USING TypeSumVarchar;
3 /
Function created.
--編寫sql實現功能
[email protected]> column col2 format a11
[email protected]> select a.col1,a.col2,b.col3,b.col4 from
2 (select col1,sumc(col2) col2 from t group by col1) a,
3 (select col1,col3,col4 from (select col1,col3,col4,row_number() over(partition by col1 order by
col1,col2) rn from t) where rn = 1) b
4 where a.col1 = b.col1;
COL COL2 COL COL
--- ----------- --- ---
A01 B01,B02 C01 D01
A02 B03,B04,B05 C03 D03
A03 B06 C06 D06
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.