一个select语句的请教!(刚才未解决,太罗嗦了,故开新贴……)

alphazhao 2002-08-21 03:55:10
有表daily如下:id为主键,其和subid,isset均为char类型,长度不一而已,numA为number类型,且siset只能为0,1。
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
16 80 1022 1
需做如下统计:
isset为1,直接select出来即可,
isset为0,如12,则numA字段必须统计为id为12的记录对应subid=102及subid=102-*(注意此处是(-*),因为可能有subid=1022的记录,必须注意)的所有记录的和,即为id=12,13,14,15的numA之和。
这样,select要求结果如下:
id NumA subid isset
11 6 101 1
12 2+10+4+14=30 102 0
13 10 102-101 1
14 4+14=18 102-102 0
15 14 102-102-101 1
16 80 1022 1

请帮忙写出这个select语句
...全文
37 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
black_snail 2002-08-22
  • 打赏
  • 举报
回复
Create View to simply your question . If you try to write complicate SQL ( ofcourse there is always a way to write it ) , It will bring you a lot of problem in future (like maintainence , performance etc.)
jlandzpa 2002-08-21
  • 打赏
  • 举报
回复
tlbbqf(为伊消的人憔悴) 是对的.
tlbbqf 2002-08-21
  • 打赏
  • 举报
回复
把test1改成diary
tlbbqf 2002-08-21
  • 打赏
  • 举报
回复
select a.id,a.subid,a.isset,sum(b.numa) from test1 a,test1 b
where (b.subid like a.subid||'-%' or a.subid=b.subid) and a.isset=0 group by a.id,a.subid,a.isset
union
select id,subid,isset,numa from test1 where isset=1
microchu 2002-08-21
  • 打赏
  • 举报
回复
先Update 后Select, 搞那么复杂干什么?
================================================================

CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!

★ 浏览帖子速度极快![建议系统使用ie5.5以上]。 ★ 多种帖子实现界面。
★ 保存帖子到本地[html格式]★ 监视您关注帖子的回复更新。
★ 可以直接发贴、回复帖子★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!
★ 支持在线检测程序升级情况,可及时获得程序更新的信息。

★★ 签名 ●
可以在您的每个帖子的后面自动加上一个自己设计的签名哟。

Http://www.ChinaOK.net/csdn/csdn.zip
Http://www.ChinaOK.net/csdn/csdn.rar
Http://www.ChinaOK.net/csdn/csdn.exe [自解压]

bobfang 2002-08-21
  • 打赏
  • 举报
回复
select id,
case when isset='1' then NumA
else (select sum(NumA) from daily b
where b.subid=a.subid
or b.subid like trim(a.subid)||'-%') end as Num,
subid,isset
from daily a;
bobfang 2002-08-21
  • 打赏
  • 举报
回复
select id,
case when isset='1' then NumA
else (select sum(NumA) from daily b
where b.subid=a.subid
or b.subid like a.subid||'-%') end as Num,
subid,isset
from daily a;
hdkkk 2002-08-21
  • 打赏
  • 举报
回复
zhaoyongzhu(zhaoyongzhu) 的solution应该可以的。
以下也供你参考

SQL> select ascii('-') from dual;

ASCII('-')
----------
45

SQL> select chr(45) from dual;

C
-
-

SQL>
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.
zhaoyongzhu 2002-08-21
  • 打赏
  • 举报
回复
这样试试:
select id,sum(numa),subid,isset from daily where isset=1 group by id,subid,isset
union
select a.id,sum(b.numa),a.subid,a.isset from daily a,(select numa,subid from daily) b where a.isset=0 and (a.subid=b.subid or b.subid like a.subid || '-%') group by a.id,a.subid,a.isset
alphazhao 2002-08-21
  • 打赏
  • 举报
回复
大哥,数据库表不是我设计的啊,说改就改?而且系统n大,影响大多,所以通过改数据库表是行不通的。另外,like subid||'-%'好像不行,我试过了,是不是'-'符号的问题?
hdkkk 2002-08-21
  • 打赏
  • 举报
回复
我的观点:

id 纯粹是多余,其实,你在sub表里以subid为主键,包含isset

daily里只要subid,numA(可能还有日期),以subid为外键,问题好解决多了,也更合理。

对于你的“-*”
可以这样啊 like subid||'-%'
就不会统计1022了。

祝你成功!
alphazhao 2002-08-21
  • 打赏
  • 举报
回复
怎么可能,刚才是跨表操作,我现在消除了跨表操作,而且将统计数据集合了起来,(id都成主键了)
sigh
不要管开头的东西了,那个表结构有点问题,帮忙的兄弟们仔细想想吧。
我实在是没好的办法解决它了
hdkkk 2002-08-21
  • 打赏
  • 举报
回复
我觉得你这样反而把刚才的问题搞复杂了。

17,377

社区成员

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

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