表结构是:parentid(母编号) id(子编号) indt(开始日期) exdt(结束日期)
10 1501 201101 203012
10 1204 201101 201105
10 1303 201101 203012
1204 2301 201101 202012
2301 3561 201101 202012
1303 5678 201101 201103
5678 3456 201101 202012
这个表的内容是一个简单的物料清单bom,这个清单有一个开始时间和结束时间,当输入年月的参数,把符合条件的物料过滤出来,值得注意的是如果该物料的上级物料不符合在时间范围的条件的话,其子物料也不能选择出来.,
参数年月=201106
最后得到的结果是
parentid(母编号) id(子编号) indt(开始日期) exdt(结束日期)
10 1501 201101 203012
10 1303 201101 203012
10 1501 201101 203012
10 1204 201101 201105
10 1303 201101 203012
1204 2301 201101 202012
2301 3561 201101 202012
1303 5678 201101 201103
5678 3456 201101 202012
这个表的内容是一个简单的物料清单bom,这个清单有一个开始时间和结束时间,当输入年月的参数,把符合条件的物料过滤出来,值得注意的是如果该物料的上级物料不符合在时间范围的条件的话,其子物料也不能选择出来.,
参数年月=201106
最后得到的结果是
parentid(母编号) id(子编号) indt(开始日期) exdt(结束日期)
10 1501 201101 203012
10 1303 201101 203012
解决方案 »
- 关于oracle11g中utl_file包的用法!
- 一表中100多列,我想把值为空的列都初始化成零,怎么写sql?
- Enterprise Manager Console
- 跪问:数据的恢复
- ORACLE控制台打不开,如何配置
- SELECT COUNT(*) FROM User_Tab_Columns WHERE upper(Table_Name) = upper('表名')的问题
- SQL查询 会的人应该很简单 在线等
- ====救命啊===,500分求此问题的解决,一次只能开100分 -- SOS
- 在sqlplus知道连接的是哪个数据库?
- 是不是xp不能装oracle啊,,我下载了好几次oracle8,准备安装的过程都出错,
- DML锁中的TM锁与DDL锁的区别,及其存在的价值?
- ORACLE 驱动加载问题
实测数据:CREATE TABLE T122
(
ParentID VARCHAR2(20),
ID VARCHAR2(20),
InDt VARCHAR2(20),
ExDt VARCHAR2(20)
);
INSERT INTO T122 VALUES('10', '1501', '201101', '203012');
INSERT INTO T122 VALUES('10', '1204', '201101', '201105');
INSERT INTO T122 VALUES('10', '1303', '201101', '203012');
INSERT INTO T122 VALUES('1024', '2301', '201101', '202012');
INSERT INTO T122 VALUES('2301', '3561', '201101', '203012');
INSERT INTO T122 VALUES('1303', '5678', '201101', '201103');
INSERT INTO T122 VALUES('5678', '3456', '201101', '202012');
实测结果:
from t122
where indt < '201106' and exdt >'201106'
start with parentid=10
connect by parentid=prior id
and indt < '201106' and exdt >'201106'
比如说在这个bom里除了上面有个日期限定之外,增加一个数量的字段
CREATE TABLE T122
(
ParentID VARCHAR2(20),
ID VARCHAR2(20),
qnt number,
InDt VARCHAR2(20),
ExDt VARCHAR2(20)
);
INSERT INTO T122 VALUES('10', '1501','1', '201101', '203012');
INSERT INTO T122 VALUES('10', '1204','2', '201101', '201105');
INSERT INTO T122 VALUES('10', '1303','1', '201101', '203012');
INSERT INTO T122 VALUES('1204', '2301','2', '201101', '202012');
INSERT INTO T122 VALUES('2301', '3561','1', '201101', '203012');
INSERT INTO T122 VALUES('1303', '5678','3', '201101', '201106');
INSERT INTO T122 VALUES('5678', '3456','3', '201101', '202012');我要把母件的数量带入到子件里,既子件的实际数量=上层母件数量*子件数量,
最后得到的结果是按照参数年月=201106的条件得到以下的结果
parentid(母编号) id(子编号) 数量indt(开始日期) exdt(结束日期)
10 1501 1 201101 203012
10 1303 2 201101 203012
1303 5678 6 201101 201106
5678 3456 18 201101 202012
FROM t122
WHERE indt < '201106' AND exdt >'201106'
START WITH parentid=10
CONNECT BY parentid=prior id
AND indt < '201106' AND exdt >'201106'
CREATE TABLE T122
(
ParentID VARCHAR2(20),
ID VARCHAR2(20),
qnt number,
InDt VARCHAR2(20),
ExDt VARCHAR2(20)
);
INSERT INTO T122 VALUES('10', '1501','1', '201101', '203012');
INSERT INTO T122 VALUES('10', '1204','2', '201101', '201105');
INSERT INTO T122 VALUES('10', '1303','1', '201101', '203012');
INSERT INTO T122 VALUES('1204', '2301','2', '201101', '202012');
INSERT INTO T122 VALUES('2301', '3561','1', '201101', '203012');
INSERT INTO T122 VALUES('1303', '5678','3', '201101', '201106');
INSERT INTO T122 VALUES('5678', '3456','3', '201101', '202012');我要把母件的数量带入到子件里,既子件的实际数量=上层母件数量*子件数量,
最后得到的结果是按照参数年月=201106的条件得到以下的结果
母编码不在有效日期里,所以其子编码也不能取到
最后得到的结果是
parentid(母编号) id(子编号) 数量indt(开始日期) exdt(结束日期)
10 1501 1 201101 203012
10 1303 2 201101 203012
1303 5678 6 201101 201106
5678 3456 18 201101 202012
10 1303 2 201101 203012这里,1303对应的数量应该是1,不是2.楼主的需求,无非是在原有列的基础上增加个计算列SELECT parentid,id,indt,exdt ,qnt * nvl( prior qnt,1)
FROM t122
WHERE indt < '201106' AND exdt >='201106'
START WITH parentid=10
CONNECT BY parentid=prior id
AND indt < '201106' AND exdt >='201106'
parentid(母编号) id(子编号) 数量indt(开始日期) exdt(结束日期)
10 1501 1 201101 203012
10 1303 1 201101 203012
1303 5678 6 201101 201106
5678 3456 18 201101 202012
INSERT INTO T122 VALUES('10', '1501','1', '201101', '203012');
INSERT INTO T122 VALUES('10', '1204','2', '201101', '201105');
INSERT INTO T122 VALUES('10', '1303','2', '201101', '203012');
INSERT INTO T122 VALUES('1204', '2301','2', '201101', '202012');
INSERT INTO T122 VALUES('2301', '3561','1', '201101', '203012');
INSERT INTO T122 VALUES('1303', '5678','3', '201101', '201106');
INSERT INTO T122 VALUES('5678', '3456','3', '201101', '202012');
parentid(母编号) id(子编号) 数量indt(开始日期) exdt(结束日期)
10 1501 1 201101 203012
10 1303 2 201101 203012
1303 5678 6 201101 201106
5678 3456 18 201101 202012
有人再帮忙看看吗 ?谢谢了。
parentid(母编号) id(子编号) 数量indt(开始日期) exdt(结束日期)
10 1501 1 201101 203012
10 1303 1 201101 203012
1303 5678 6 201101 201106
5678 3456 18 201101 202012
对于你的需求,变通一下实现。先自定义一个函数:
create or replace function f_comp(arg varchar2) return number
is
ls_sql varchar2(4000);
li_result number;
begin
ls_sql := 'select '||nvl(arg,'null')||' from dual';
execute immediate ls_sql into li_result;
return li_result;
end;
然后sql:
SELECT parentid,
id,
indt,
exdt,
qnt,
f_comp('1'||sys_connect_by_path(qnt,'*'))
FROM t122
WHERE indt < '201106'
AND exdt >= '201106'
START WITH parentid = 10
CONNECT BY parentid = prior id
AND indt < '201106'
AND exdt >= '201106'
and prior indt < '201106'
and prior exdt >= '201106';这样写,可以计算任意多层