一个关于某字段的like复合查询问题请教!

alphazhao 2002-08-21 10:45:25
我有两个表
Sub表如下:
subid(char) isset(char)
101 1
102 0
102-101 1
102-102 0
102-102-101 1
102-102-102 1
说明:
其中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表如下:
subid(char) numA(num)
101 1
102 2
102-101 3
102-102 4
101 5
102-102-101 6
102-101 7
102-102-101 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

请问该如何设计这个select语句?注意取subid=A-*时,必须确定是A-*,不是*A-*,即A在字段的最左方,这也是唯一确定父科目的关键。比如"102-101-102-21"就不是"101-102"的子科目,尽管它的subid有这几个字符。
我想了一天都找不到头绪,请大家帮忙设计一下这个select语句啊。若一个select语句不好完成,写成视图也行。
...全文
66 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Croatia 2002-08-21
  • 打赏
  • 举报
回复
很简单呀!
SELECT SUM(Daily.NUMA) FROM SUB,Daily
WHERE SUB.SUBID(+) = Daily.SUBID
AND B.SUBID LIKE 'A%'

因为里面的数据决定了这个性质.
zhaoyongzhu 2002-08-21
  • 打赏
  • 举报
回复
给分吧。我要向五角星进军。
hdkkk 2002-08-21
  • 打赏
  • 举报
回复
很容易的问题,应该自己多想想
zhaoyongzhu 2002-08-21
  • 打赏
  • 举报
回复
SQL> select * from sub;

SUBID ISSET
-------------------- ----------
101 1
102 0
102-101 1
102-102 0
102-102-101 1
102-102-102 1

6 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 8

8 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型
wujinbao 2002-08-21
  • 打赏
  • 举报
回复
用存储过程可以么?
hdkkk 2002-08-21
  • 打赏
  • 举报
回复
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
;
alphazhao 2002-08-21
  • 打赏
  • 举报
回复
改表是不大可能的说……
jlandzpa 2002-08-21
  • 打赏
  • 举报
回复
首先是你表结构的设计有问题,才造成现在的困难.
zhaoyongzhu 2002-08-21
  • 打赏
  • 举报
回复
SQL> select * from sub;

SUBID ISSET ID
-------------------- ---------- ----------
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 17

7 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 9

9 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 0

6 rows selected.
alphazhao 2002-08-21
  • 打赏
  • 举报
回复
得了,通过下面的语句
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则不变
hdkkk 2002-08-21
  • 打赏
  • 举报
回复
自己在想想,我想你会成功的。

加油把!
alphazhao 2002-08-21
  • 打赏
  • 举报
回复
大哥们,看清楚再说话好不好?主要是要对subid进行统计的
就是说若无子科目(isset=1),直接统计这个subid在daily表中的id记录就行
若有子科目(isset=0),就需要统计自身和所有子科目(包括子科目的子科目)的subid对应的id在daily的所有记录和。
zhaoyongzhu 2002-08-21
  • 打赏
  • 举报
回复
同意楼上。
hdkkk 2002-08-21
  • 打赏
  • 举报
回复
无非是相等的连接条件改一改

a.id=b.id



alphazhao 2002-08-21
  • 打赏
  • 举报
回复
注意subid可能有这种情况,比如102和1022等,直接like subid||'%'是不行的说!高手们继续帮忙吧,我加分。
老实说,我对oracle的pl/sql不怎么熟
另外,写成视图也行。
alphazhao 2002-08-21
  • 打赏
  • 举报
回复
不好意思,是我弄错了,表不是这么简单的……改正sub表和daily表如下,其他数据、要求不变
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

17,377

社区成员

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

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