求一条SQL

请输入... 2009-05-07 12:55:50


create table NODE
(
NODECODE CHAR(8) not null,
NODENAME VARCHAR(100) not null,
NODEWITH CHAR(8)

);
/*
NODE 是网点表:NODECODE网点编号,VARCHAR网点名,NODEWITH 属于那个网点
*/

insert into node values( '00000000','总部',null);

insert into node values( '00000001','广东分公司','00000000');
insert into node values( '00000002','四川分分公司','00000000');

insert into node values( '00000005','云南分分公司','00000000');
insert into node values( '00000003','广州办事处','00000001');
insert into node values( '00000004','成都办事处','00000002');
insert into node values( '00000006','昆明办事处','00000005');



create table USERORDER
(
NODECODE CHAR(8),
USERCODE CHAR(8),
DEALRATE INTEGER
);
/*
USERORDER 订单审核人表:NODECODE网点编号(与NODE表的NODECODE关联),USERCODE用户编号,DEALRATE 等级
*/
insert into USERORDER values( '00000000','A1',1);
insert into USERORDER values( '00000001','B1',1);
insert into USERORDER values( '00000001','B2',2);
insert into USERORDER values( '00000002','C1',1);
insert into USERORDER values( '00000002','C2',2);
insert into USERORDER values( '00000003','D1',1);
insert into USERORDER values ('00000004','D2',1);
insert into USERORDER values( '00000006','F1',1);

/*
我要的结果是订单审核的几种线路

比如:广东分公司的订单是让 D1 B1 B2 A1 按顺序审(B1 B2同一级,B2等级数据高一点,所以B1在B2前)
云南公公司在分公司时没有人,所以就只有总部与办事处审核



结果是: D1 B1 B2 A1
D2 C2 C1 A1
F1 A1
*/



drop table node;
drop table USERORDER;


...全文
174 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
请输入... 2009-05-11
  • 打赏
  • 举报
回复
虽然没有我要的结果,但还是要谢谢各位
请输入... 2009-05-08
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 superhsj 的回复:]
明白了,还有一个问题就是,我刚刚提到的,列数是不是不固定,比如B1和B2是同一级的,但占用了两列,他有没有可能出现3列,或者办事处和总部会不会出现多列的情况
[/Quote]
可能出现多列的,是不固定的
请输入... 2009-05-08
  • 打赏
  • 举报
回复
列数实际上是不固定的,当然你们也可以写固定的,(下面的是不能审核上面的,这个你们不用管,我用程序控制好的)我只是想站在部的角度,把他们全部显示
ldw2545398 2009-05-08
  • 打赏
  • 举报
回复
我问下 你要是想审核总公司 是怎么走的!
广东分公司的订单是让 D1 B1 B2 A1 按顺序审
阿三 2009-05-08
  • 打赏
  • 举报
回复
列数不固定,用存储过程吧
superhsj 2009-05-08
  • 打赏
  • 举报
回复
明白了,还有一个问题就是,我刚刚提到的,列数是不是不固定,比如B1和B2是同一级的,但占用了两列,他有没有可能出现3列,或者办事处和总部会不会出现多列的情况
请输入... 2009-05-08
  • 打赏
  • 举报
回复
不好意思,是我写错了

结果是: D1 B1 B2 A1
D2 C1 C2 A1
F1 A1

我要的结果大概意思就是,从总部到分公司有多少条审核线路,
比如:总部是让 A1 一个人审,所以他是第一级
广东分公司: D1 B1 B2 A1

因为D1(办事处)是最下面的所以它是第一个审核人:
(B1,B2)是同一级的,但B1等级(DEALRATE )小,所以他在B2前
A1是总部的,他是最后一个审核人


我不知道现在说清楚没
superhsj 2009-05-08
  • 打赏
  • 举报
回复
这个列数是不固定的吧。好多地方都不明白B1在B2前面,那为什么C1在C2后面呢
taotie1225 2009-05-08
  • 打赏
  • 举报
回复
up了
ngx20080110 2009-05-08
  • 打赏
  • 举报
回复
up
superhsj 2009-05-08
  • 打赏
  • 举报
回复
列不固定的话,就比较复杂了。以前写过一个类似的,但你这个比那个更复杂,先按我自己理解写了一个,可能不太对,lz试试吧

create or replace package RefCursor is   
type t_RefCursor is ref cursor;  
end RefCursor;


create or replace procedure test
as
v_cur RefCursor.t_RefCursor;
v_count varchar2(8);
v_level number;
v_sql varchar2(4000);
v_sql1 varchar2(4000);
i number;
begin
v_sql:='create or replace view aaa as select '
open v_cur for 'select b.level,count(1)
from USERORDER a left join (select level,NODECODE from NODE connect by prior NODECODE=NODEWITH) b
on a.NODECODE=b.NODECODE group by b.level order by level desc';
open v_cur;
fetch v_cur into v_level,v_count;
while v_cur %found loop
for i in 1..v_count loop
v_sql1:=v_sql1||' ,max(case when level='||v_level||' and DEALRATE='||v_count||' then USERCODE else null end) col_'||v_level||'_'||i;
exit when i=v_count;
end loop;
fetch v_cur into v_level,v_count;
end loop;
close v_cur;
v_sql1:=v_sql1||' from (select b.level,a.DEALRATE,a.USERCODE
from USERORDER a left join (select level,NODECODE from NODE connect by prior NODECODE=NODEWITH) b
on a.NODECODE=b.NODECODE) tab'
execute immediate v_sql||substr(v_sql1,2);
end;
/

select * from aaa;

[Quote=引用 17 楼 yangfuen637200 的回复:]
可能出现多列的,是不固定的
[/Quote]
tutucool 2009-05-08
  • 打赏
  • 举报
回复
up
inthirties 2009-05-08
  • 打赏
  • 举报
回复
只能用procedure来做吧

不过,如果可以的话,最好是通过程序代码来做了。把两个表全取出来,内存整理结构,然后把结构cache住。

Angly1018 2009-05-07
  • 打赏
  • 举报
回复
我也没有明白,可能是我业务不熟,帮顶一下
wangsong145 2009-05-07
  • 打赏
  • 举报
回复
楼主这是要干嘛?
cheng_fengming 2009-05-07
  • 打赏
  • 举报
回复
看不懂啊 呵呵 顶一下
Adebayor 2009-05-07
  • 打赏
  • 举报
回复
不太明白到底什么意思!
wolf110 2009-05-07
  • 打赏
  • 举报
回复
不明白意思!
tanzuwen 2009-05-07
  • 打赏
  • 举报
回复
不太明白!~
liulongjin2008 2009-05-07
  • 打赏
  • 举报
回复
select node,nodecode,usercode,dealrate from
(select b.nodecode nodecode ,a.nodecode node , a.usercode usercode ,a.dealrate dealrate from USERORDER a ,node b
where a.nodecode = b.nodecode
and b.nodecode<>'00000000'
and nodewith='00000000'
union
select b.nodecode nodecode ,a.nodecode node ,a.usercode usercode ,a.dealrate dealrate from USERORDER a ,node b
where a.nodecode=b.nodewith
and b.nodecode<>'00000000'
and nodewith='00000000'
union
select b.nodecode nodecode ,a.nodecode node ,a.usercode usercode ,a.dealrate dealrate from USERORDER a ,node b
where a.nodecode=(select nodecode from node c where c.nodewith=b.nodecode )
and b.nodecode<>'00000000'
and nodewith='00000000')
order by nodecode ,node desc ,dealrate
加载更多回复(1)

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧