高手请进--寻求解决办法(*求助*)

Strawberry79 2003-03-11 04:17:07
我有一张表:
ID ADDV YY KIND Col1 Col2 FLAG
1 23 2000 工业 14 2.3 23_2000
2 23 2000 农业 36 3.74 23_2000
3 23 2000 合计 50 6.04 23_2000_HJ*
4 24 2000 地表水 20 2.4 24_2000
5 24 2000 地下水 10 3.2 24_2000
6 24 2000 合计 30 5.6 24_2000_HJ*

问题:上面表中记录3和6均是1、2条记录和4、5条记录的和,这两条记录我想在用户输入1、2条记录之后第3条记录写一个触发器自动生成。
为了标识不同的合计由不同的记录生成,所以我加了FLAG字段。
我想写一个触发器,用户INSERT一条记录,我里面就处理一下合计那条记录,具体怎么写还没想好,但我这种想法是否可行,请高手指点!多谢!:)
...全文
25 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Strawberry79 2003-03-12
  • 打赏
  • 举报
回复
感谢各位的支持!问题已解决,用snowy_howe(天下有雪) 的办法可以最快的方式实现我的目的,就是生成结果排序上有点小问题,但稍微改一下就可以了!
Lastdrop(空杯)的方法有时间我也会试试!
谢谢各位!:)
Lastdrop 2003-03-12
  • 打赏
  • 举报
回复
只要不显示id ,就可以利用addv,yy,id排序得到你需要的显示结果。

select ... from -- not include id!
(
select id, ... from yourtable
union all
select 9999999 as id, .... from 合计表
)
order by addv,yy,id
snowy_howe 2003-03-12
  • 打赏
  • 举报
回复
合计表都不用建,flag字段也可不要。
直接建立视图即可。
create or replace view aa_view
select addv,yy,sum(col1) col1,sum(col2) col2 from aa group by addv,yy;

这样如果想得到你的结果,可以执行查询:
select addv,yy,kind,col1,col2 from aa
union
select addv,yy,'合计',col1,col2 from aa_view
order by 1,2
这样也可以吧?!
Strawberry79 2003-03-12
  • 打赏
  • 举报
回复
也许是个好方法,我每次执行插入时,触发一个触发器,按照我的目的求合,如果这条合计的记录已存在于合计表中,就更新其值,如果没有就插入一条新记录.
合计表我有了,可将来我查询时怎么能连成我想要的样子呢?每条合计记录显示在不同的位置,
如:
ID ADDV YY KIND Col1 Col2 FLAG
1 23 2000 工业 14 2.3 23_2000
2 23 2000 农业 36 3.74 23_2000
3 23 2000 合计 50 6.04 23_2000_HJ
4 24 2000 地表水 20 2.4 24_2000
5 24 2000 地下水 10 3.2 24_2000
6 24 2000 合计 30 5.6 24_2000_HJ
我1/2/4/5条记录在一张表,3/6在一张表,怎么连呢?
Lastdrop 2003-03-11
  • 打赏
  • 举报
回复
为什么不换种思路,干脆新建一张合计表,每次插入记录时,就利用触发器按照ADDV, YY 将对应的Col1和Col2合计到合计表中,查询的时候只要连接一下就可以了。
Strawberry79 2003-03-11
  • 打赏
  • 举报
回复
合计问题解决,但我怎么实现不同的合计呢?比如:

3 23 2000 合计 50 6.04 23_2000_HJ
6 24 2000 合计 30 5.6 24_2000_HJ

3是1\2条记合计来的,6是4\5条记录合计来的,用个什么方法能够智能的判断一下呢?是写个触发器插一条就判断一条,还是写个过程什么???迷茫~~~~~
谁合计谁是通过FLAG字段标识的,所以上面语句也要group by FLAG才行

bzszp 2003-03-11
  • 打赏
  • 举报
回复
insert into tbname select max(id)+1,addv,max(yy),'合计',sum(col1),sum(col2),max(flag)||'HJ*' from tbname group by addv;
Strawberry79 2003-03-11
  • 打赏
  • 举报
回复
ID ADDV YY KIND Col1 Col2 FLAG
1 23 2000 工业 14 2.3 23_2000
2 23 2000 农业 36 3.74 23_2000

4 24 2000 地表水 20 2.4 24_2000
5 24 2000 地下水 10 3.2 24_2000

现在问题是我表里没有那两条记录,我用什么方法把它们插进去呢?其值就是每条合计上面的N条记录值的和。

越想越糊涂~~~~~~~~~~~能实现吗?(越来越怀疑可行性了!呵呵)
Strawberry79 2003-03-11
  • 打赏
  • 举报
回复
我的ORACLE不是9i是8i,我的目的就是让我的表自动生成那两条合计的记录(用户是不会INSERT那两条的),哪种方法效率高我当然就用哪种喽,就是不会!:P
建视图可实现我的目的吗?请高手细说来....
Lastdrop 2003-03-11
  • 打赏
  • 举报
回复
不知道你这样做的目的何在,不过

1. FLAG字段无需如此麻烦,只要用0,1表示是否是合计结果就行了,至于23_2000之类的,已经有ADDV和YY字段表示了。
2.你在触发器里是无法查询触发表的,不知你如何得到合计,还是在程序里处理比较好。
mywhsw 2003-03-11
  • 打赏
  • 举报
回复
不说你的目的如何,不过我不会用这个,一定用视图去查询象up说的一样
mywhsw 2003-03-11
  • 打赏
  • 举报
回复
没问题,你做以下判断:
1,用户输入的分别存放在临时表里,FLAG里不包括HJ*字样,所以触发器执行操作
2,第一步执行插入记录操作,又触发了触发器,但FLAG里包括HJ*字样,所以触发器不执行操作,
3,如此循环,ok!
supershb 2003-03-11
  • 打赏
  • 举报
回复
我不赞成。
1:有触发器会大大降低新增删除的速度
2:新增你要写trigger,删除你也要写trigger,更新你还要写trigger。维护麻烦!

你写trigger是为了查询方便,我觉得你可以写成视图来做。
如果你的版本是oracle9i以上的话,你可以做成物化视图,那样更简单。
查许也很方便。

17,377

社区成员

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

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