这句SQL怎么写?(在线)

zek 2002-12-19 09:28:15
有表test1
字段 AAA(INT) BBB(INT) CCC(DATE)
1 20 2002-1-5
2 30 2002-5-6
3 23 2002-12-12
4 7 2001-6-7
5 93 2002-12-13
。 。 。
。 。 。
。 。 。
表TEST2
DDD(INT) EEE(CHAR)
2 ASD
5 ASDSAD
。 。
。 。
。 。
表TEST3
HHH DANGRI DANGYUE DANGNIAN
我想将对表TEST1做触发器,当表TEST1中的数据有变动时进行如下操作:对表TEST1中AAA字段与TEST2中DDD字段相等处的行做GROUP BY,再按照CCC字段的日期按当日,当年,当月对BBB字段做合计,然后将EEE,BBB当日合计,BBB当月合计,BBB当年合计,插入到表TEST3的HHH,DANGRI,DANGYUE,DANGNIAN 中去。请大侠们不吝赐教,先谢谢了!
...全文
29 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zek 2002-12-20
  • 打赏
  • 举报
回复
海阔老师,谢谢您了!
昵称被占用了 2002-12-20
  • 打赏
  • 举报
回复
试一下这个触发器。

create trigger tr_test1
on test1
for insert,update,delete
as
select eee,ccc,bbb
into #temp1
from inserted i,test2 t
where i.aaa=t.ddd
union all
select eee,ccc,bbb
from deleted d,test2 t
where d.aaa=t.ddd

select eee,sum(bbb) as dangri
into #temp2
from #temp1
where convert(char(8),ccc,112)=convert(char(8),getdate(),112)

update test3
set dangri=test3.dangri+t.dangri
from test3,#Temp2 t
where test3.hhh=t.eee

insert test3(hhh,dangri,dangyue,dangnian)
select eee,dangri,0,0 from #Temp2 t
where not exists (
select * from test3 where where test3.hhh=t.eee)

drop table #Temp2

select eee,sum(bbb) as dangyue
into #temp3
from #temp1
where year(ccc)=year(getdate())
and month(ccc)=month(getdate())

update test3
set dangyue=test3.dangyue+t.dangyue
from test3,#Temp3 t
where test3.hhh=t.eee

insert test3(hhh,dangri,dangyue,dangnian)
select eee,0,dangyue,0 from #Temp3 t
where not exists (
select * from test3 where where test3.hhh=t.eee)

drop table #Temp3

select eee,sum(bbb) as dangnian
into #temp4
from #temp1
where year(ccc)=year(getdate())


update test3
set dangnian=test3.dangnian+t.dangnian
from test3,#Temp4 t
where test3.hhh=t.eee

insert test3(hhh,dangri,dangyue,dangnian)
select eee,0,0,dangnian from #Temp4 t
where not exists (
select * from test3 where where test3.hhh=t.eee)

drop table #Temp4

go
昵称被占用了 2002-12-20
  • 打赏
  • 举报
回复
正是这个问题,如果每次TEST1,TEST2表有更动时,都需要删除所有TEST3表的数据,重新统计,至少不如不用触发器,需要汇总数据的时候再查询(因为触发器大部分工作是无效的,而且很影响性能)。

如果用触发器的话,就应该分析好逻辑,保证每次只修改很少的数据。
zek 2002-12-19
  • 打赏
  • 举报
回复
谢谢海阔大侠,TEST3这个表是准备用来做报表的(非本人意愿,中间这个表肯定是要的),我想在TEST1,TEST2表有更动时从新对TEST3表的数据全部删除,然后将新数据计算好之后再插入进去。不知海阔大侠有什么建议
昵称被占用了 2002-12-19
  • 打赏
  • 举报
回复
当日,当年,当月放在一起不合理,删除的话在12月看不到11月的总数。

这样分析:
1、插入、修改、删除当天数据,影响当日,当月,当年汇总。
2、插入、修改、删除当月非当天数据,不影响当日汇总,影响当月,当年汇总。
3、插入、修改、删除当年非当月数据,不影响当日,当月汇总,影响当年汇总。
4、如果修改了日期字段,情况会更复杂。

触发器可以写,但关键是先搞清楚设计的合理性。




zek 2002-12-19
  • 打赏
  • 举报
回复
海阔大侠,您是指BBB字段的数据?我想在TEST1和TEST2上都做触发器,在数据有修改的时候就对TEST3进行更新(或是删除原来的数据,在插入更新后的数据)
昵称被占用了 2002-12-19
  • 打赏
  • 举报
回复
修改5月份的数据怎么办??
zek 2002-12-19
  • 打赏
  • 举报
回复
谢谢!
当日,当月,当年是对今天来说的,比如今天是2002年12月19号,那当日就是2002年12月19号,当月是2002年12月,当年是指2002年。HHH字段中的ASD只可能有一条。DANGRI ,DANGYUE ,DANGNIAN 字段应该是BBB字段的合计数
乌饭树 2002-12-19
  • 打赏
  • 举报
回复
select b.EEE,datepart(yy,a.CCC),sum(a.BBB) from test1 a, test2 b where a.AAA=b.DDD
group by datepart(yy,CCC),b.EEE
昵称被占用了 2002-12-19
  • 打赏
  • 举报
回复
当日,当年,当月是什么概念?
如果test1数据如上,
TEST2
DDD(INT) EEE(CHAR)
1 ASD
2 ASD
5 ASDSAD

TEST3 中hhh=ASD的记录有几条??
如果一条,DANGRI DANGYUE应该什么数?
如果多条,怎么区分??


34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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