oracle中树形数据,ORACLE树形数据解决方法

ORACLE树形数据

CREATE TABLE basic

(

id number(8) primary key,

name varchar(50) unique,

ismemo char(1) default '0',--备注项不参与累计

parent_id number(8)

)

INSERT INTO basic VALUES(1,'basic1',0,0);

INSERT INTO basic VALUES(2,'basic2',0,1);

INSERT INTO basic VALUES(3,'basic3',1,2);

INSERT INTO basic VALUES(4,'basic4',0,1);

INSERT INTO basic VALUES(5,'basic5',0,4);

INSERT INTO basic VALUES(6,'basic6',0,1);

commit;

CREATE TABLE basic_record

(

id number(8) primary key,

basic_id number(8),

plan_val number,

foreign key(basic_id) references basic(id)

)

--填报表只填报子项目

INSERT INTO basic_record VALUES(1,6,100);

INSERT INTO basic_record VALUES(2,5,200);

INSERT INTO basic_record VALUES(3,3,500);

commit;

希望得到的结果:(子级汇总到父项ismemo不包括在内)

name     plan_val

basic1   300

basic2   0

basic3   500

basic4   200

basic5   200

basic6   100

------解决方案--------------------

--子节点和父节点的对应关系

WITH TMP AS

(SELECT ID

,NAME

,ISMEMO

,CONNECT_BY_ISLEAF AS ISFLAG

,CONNECT_BY_ROOT   ID AS ROOT

FROM BASIC

WHERE CONNECT_BY_ISLEAF = '1'

CONNECT BY PRIOR ID = PARENT_ID)

SELECT TMP.ROOT

,SUM(CASE

WHEN TMP.ISMEMO = '1' AND TMP.ID <> TMP.ROOT THEN--memo,并且向父节点合计的时候为0

0

ELSE

R.PLAN_VAL

END)

FROM BASIC_RECORD R

JOIN TMP

ON R.BASIC_ID = TMP.ID

GROUP BY TMP.ROOT

ORDER BY TMP.ROOT

试试看可以不

------解决方案--------------------

引用:CREATE TABLE basic

(

id number(8) primary key,

name varchar(50) unique,

ismemo char(1) default '0',--备注项不参与累计

parent_id number(8)

)

INSERT INTO basic VALUES(1,'basic1',0,0);

INSERT INTO basic VALUES(2,'basic2',0,1);

INSERT INTO basic VALUES(3,'basic3',1,2);

INSERT INTO basic VALUES(4,'basic4',0,1);

INSERT INTO basic VALUES(5,'basic5',0,4);

INSERT INTO basic VALUES(6,'basic6',0,1);

commit;

CREATE TABLE basic_record

(

id number(8) primary key,

basic_id number(8),

plan_val number,

foreign key(basic_id) references basic(id)

)

--填报表只填报子项目

INSERT INTO basic_record VALUES(1,6,100);

INSERT INTO basic_record VALUES(2,5,200);

INSERT INTO basic_record VALUES(3,3,500);

commit;

希望得到的结果:(子级汇总到父项ismemo不包括在内)

name     plan_val

basic1   300

basic2   0

basic3   500

basic4   200

basic5   200

basic6   100

select root_nm name,

sum(decode(t2.name,

root_nm,

plan_val,

decode(ismemo, '1', 0, plan_val))) plan_val

from basic_record t3,

(select t1.*, connect_by_root t1.name root_nm

from basic t1

connect by prior id = parent_id) t2

where t2.id = t3.basic_id(+)

group by root_nm;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值