首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

求一SQL语句,候!ORACLE9I!多谢

2012-01-31 
求一SQL语句,急,在线等候!ORACLE9I!谢谢现在的表中有数据IDVALUE1VALUE21a0.11b0.21c0.32a0.12c0.3现在我

求一SQL语句,急,在线等候!ORACLE9I!谢谢
现在的表中有数据
    ID         VALUE1         VALUE2
    1             a                     0.1
    1             b                     0.2
    1             c                     0.3
    2             a                     0.1
    2             c                     0.3

现在我想取得的结果是
    ID         result1           result2
    1           a、b、c           0.1、0.2、0.3
    2           a、c                 0.1、0.3
其中value1和value2的个数是不定的,只能用一个sql语句实现

[解决办法]

CREATE OR REPLACE TYPE T_LINK AS OBJECT (
STR VARCHAR2(30000),
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT T_LINK) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT T_LINK, VALUE IN VARCHAR2) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN T_LINK, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBER) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT T_LINK, CTX2 IN T_LINK) RETURN NUMBER
)



CREATE OR REPLACE TYPE BODY T_LINK IS
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT T_LINK) RETURN NUMBER IS
BEGIN
SCTX := T_LINK(NULL);
RETURN ODCICONST.SUCCESS;
END;

MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT T_LINK, VALUE IN VARCHAR2) RETURN NUMBER IS
BEGIN
SELF.STR := SELF.STR || ', '|| VALUE;
RETURN ODCICONST.SUCCESS;
END;

MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN T_LINK, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBER) RETURN NUMBER IS
BEGIN
RETURNVALUE := LTRIM(SELF.STR, ', ');
RETURN ODCICONST.SUCCESS;
END;

MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT T_LINK, CTX2 IN T_LINK) RETURN NUMBER IS
BEGIN
NULL;
RETURN ODCICONST.SUCCESS;
END;
END;



CREATE OR REPLACE FUNCTION f_StrLink(P_STR VARCHAR2) RETURN VARCHAR2
AGGREGATE USING T_LINK;

先写个聚合函数,然后这样就可以了:
select year
,f_strLink(decode(flag, '1 ',qua, ' ')) as qua
,f_strLink(decode(flag, '2 ',qua, ' ')) as amo
from(
select year, '1 ' as flag
,f_strLink(quarter) as qua
--,f_strLink(amount)
from (select * from tbname order by id,result1,result2)
group by year
union all
select year, '2 ' as flag
--,f_strLink(quarter)
,f_strLink(amount) as qua
from (select * from tbname order by id,result1,result2)
group by year
)
group by year
[解决办法]
create table test(id number,value1 varchar2(10),value2 number(10,1))

insert into test values(1, 'a ',0.1);
insert into test values(1, 'b ',0.2);
insert into test values(1, 'c ',0.3);


insert into test values(2, 'a ',0.1);
insert into test values(2, 'c ',0.3);
commit;


select b.id,
(select ltrim(max(sys_connect_by_path(a.value1, '、 ')), '、 ') value1
from (select a.id,
a.value1,
a.n,
lead(a.n) over(partition by a.id order by a.n) n1
from (select a.id,
a.value1,
row_number() over(order by a.id, a.value1 desc) n
from test a) a) a
start with a.id = b.id
and a.n1 is null
connect by n1 = prior a.n) v1,
(select ltrim(max(sys_connect_by_path(a.value2, '、 ')), '、 ') value2
from (select a.id,
a.value2,
a.n,
lead(a.n) over(partition by a.id order by a.n) n1
from (select a.id,
a.value2,
row_number() over(order by a.id, a.value2 desc) n
from test a) a) a
start with a.id = b.id
and a.n1 is null
connect by n1 = prior a.n) v2
from (select distinct a.id from test a) b


热点排行