select a.subid,sum(b.numA),a.isset from Sub a,Daily b where a.subid=b.subid and a.isset=1
group by a.subid,a.isset
union all
select a.subid,sum(b.numA),a.isset from Sub a,Daily b where
b.subid like a.subid||'%' and a.isset=0
group by a.subid,a.isset
;
group by a.subid,a.isset
union all
select a.subid,sum(b.numA),a.isset from Sub a,Daily b where
b.subid like a.subid||'%' and a.isset=0
group by a.subid,a.isset
;
解决方案 »
- Oracle 查询varchar2丢失数据问题
- PL/SQL中的包体问题
- 问一个弱弱的问题
- 如何将oracle 中的 表空间 从 A机 中的oracle10g 移植到 B机的oracle10g 上用
- 一个关于sequence的奇怪问题,急!!!!请大家帮忙啦!!
- 安装 oracle9i database 9.2.0.1.0(92010NT)时出错!?
- 在DELPHI中如何用ADO向ORACLE发送(断开逻辑)break on id 或 show all之类的命令啊?
- Oracle8.1.7在Windows XP下安装的问题
- 已知表名,如何知道该表包含什么字段?sql语句该如何写?
- Oracle中如何保存文件到数据库,从数据库取文件
- 请问,哪有Oracle9i下载
- 关于enterprise manager..的问题。。。。
-------------------- ----------
101 1
102 0
102-101 1
102-102 0
102-102-101 1
102-102-102 16 rows selected.SQL> select * from daily;SUBID NUMA
-------------------- ----------
101 1
102 2
102-101 3
102-102 4
101 5
102-102-101 6
102-101 7
102-102-101 88 rows selected.SQL> select a.subid,sum(numa),isset from sub a,daily b where a.isset=1 and a.subid=b.subid group by
a.subid,isset
2 union all
3 select a.subid,sum(numa),isset from sub a,daily b where a.isset=0 and b.subid like a.subid || '
%' group by a.subid,isset;SUBID SUM(NUMA) ISSET
-------------------- ---------- ----------
101 6 1
102 30 0
102-101 10 1
102-102 18 0
102-102-101 14 1注意:我的isset是number型
SELECT SUM(Daily.NUMA) FROM SUB,Daily
WHERE SUB.SUBID(+) = Daily.SUBID
AND B.SUBID LIKE 'A%'因为里面的数据决定了这个性质.
Sub表如下:
id(char) subid(char) isset(char)
11 101 1
12 102 0
13 102-101 1
14 102-102 0
15 102-102-101 1
16 102-102-102 1
说明:
id为主键约束。其中subid中为"*1-*2"即表明它是subid为"*1"的子科目,如102-102-101即为102-102的子科目,而102-102又为102的子科目;isset为0,说明此科目存在子科目,isset为1说明其为底层科目,即不存在其子科目,如101,102-101,102-102-101,102-102-102。当然,命名可以为*-*的其他符号,比如"科目-002",但"-"符号必定是子科目必备的特征。
Daily表如下:
id(char) numA(num)
11 1
12 2
13 3
14 4
11 5
15 6
13 7
15 8
说明:此subid是sub表中subid外键,可以不唯一。
现需要对此表做如下统计:
对于任一subid A,若其对应sub表中isset字段为1(即为底层科目),直接累加Daily表中subid=A的所有记录字段numA之和sum(numA);若其对应sub表中siset字段为0,则累加Daily表中subid=A和subid=A-*的所有记录字段numA之和sum(numA)。
如上表记录统计应得到如下结果:
subid numA isset
101 1+5=6 1
102 2+3+4+6+7+8=30 0
102-101 3+7=10 1
102-102 4+6+8=18 0
102-102-101 6+8=14 1
老实说,我对oracle的pl/sql不怎么熟
另外,写成视图也行。
就是说若无子科目(isset=1),直接统计这个subid在daily表中的id记录就行
若有子科目(isset=0),就需要统计自身和所有子科目(包括子科目的子科目)的subid对应的id在daily的所有记录和。
select * from (select A.id,sum(A.numA) as num,B.subid,B.isset from daily A, sub B
where A.id = B.id
group by A.id,B.subid,B.isset)
我现在只需要如下:
对select的结果如下进行以上统计!!!!!!!!!!
id NumA subid isset
11 6 101 1
12 2 102 0
13 10 102-101 1
14 4 102-102 0
15 14 102-102-101 1
若isset为0,如id=12的记录,统计subid=102和subid=102-*的所有记录numA的和。
isset为1则不变
-------------------- ---------- ----------
101 1 11
102 0 12
102-101 1 13
102-102 0 14
102-102-101 1 15
102-102-102 1 16
1022 1 177 rows selected.SQL> select * from daily;SUBID NUMA
-------------------- ----------
11 1
12 2
13 3
14 4
11 5
15 6
13 7
15 8
17 99 rows selected.SQL> select a.subid,sum(numa),isset from sub a,daily b where a.id=b.subid and a.isset=1 group by a.s
ubid,isset
2 union all
3 select a.subid,sum(b.numa),a.isset from sub a,(select c.subid as subid,d.numa as numa from sub
c,daily d where c.id=d.subid ) b where a.isset=0 and (b.subid like a.subid || '-%' or b.subid=a.subi
d) group by a.subid,a.isset;SUBID SUM(NUMA) ISSET
-------------------- ---------- ----------
101 6 1
102-101 10 1
102-102-101 14 1
1022 9 1
102 30 0
102-102 18 06 rows selected.