Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Агрегатные функции в триггерах  [new]
user933867
Member

Откуда:
Сообщений: 1
Уважаемые форумчане! Есть таблицы Студент и Успеваемость, связанные по полю Код студента (ks). Необходимо создать триггер на удаление из таблицы Успеваемость, в теле которого при удалении строки из таблицы Успеваемость обновляется средний балл студента (ball) с помощью агрегатной функции AVG.

create trigger new_ball
on uspevaemost
for delete
as
declare @ks varchar(3)
declare @ball float
begin
select @ks=ks from deleted
select @ball=AVG(ozenka) from uspevaemost group by ks
update student set ball=@ball where @ks=student.ks
end

Выводит совершенно не то, что нужно.
Буду признателен за помощь!
9 июн 15, 23:47    [17752932]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатные функции в триггерах  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
user933867,

для этого надо иметь уникальный ключ строки в таблице Успеваемость например ku
тогда тригер может выглядеть примерно так
create trigger new_ball
on uspevaemost
for delete
as
begin

update s SET s.ball = t.ball
from student s
join (select u.ks , ball = AVG(u.ozenka) 
from uspevaemost u 
where   exists(select * from deleted where ks = u.ks) 
and not exists(select * from deleted where ku = u.ku) 
group by u.ks) t on t.ks = s.ks

end
10 июн 15, 08:48    [17753329]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатные функции в триггерах  [new]
Glory
Member

Откуда:
Сообщений: 104751
user933867
Выводит совершенно не то, что нужно.

Так вы сначала свой код гнапишите без триггера
Например, узнайте, какой результат водит ваш запрос
select AVG(ozenka) from uspevaemost group by ks
И что из него попадет в переменную @ball
10 июн 15, 10:04    [17753611]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить