ник: Мюллер
Вчера образовался у мну дополнительный выходной, потому посмотрел только сегодня.
Таблица Table1 имеет вид
Id
MyNum
MySum
MyComp - наименование компании
Тогда хранимка должна быть такой
ALTER PROCEDURE _spMyProc
AS
DECLARE @MySum int
DECLARE @MyNum int
DECLARE @Id int
DECLARE @MyComp nvarchar(50)
DECLARE CurComp CURSOR FOR
SELECT DISTINCT MyComp FROM Table1
OPEN CurComp
FETCH NEXT FROM CurComp INTO @MyComp
WHILE @@FETCH_STATUS = 0
BEGIN
SET @MySum=0
DECLARE CurSum CURSOR FOR
SELECT MyNum,Id,MyComp FROM Table1 WHERE MyComp LIKE @MyComp
OPEN CurSum
FETCH NEXT FROM CurSum INTO @MyNum ,@Id,@MyComp
WHILE @@FETCH_STATUS = 0
BEGIN
SET @MySum = @MySum + @MyNum
UPDATE Table1 SET MySum = @MySum WHERE Id=@Id AND MyComp LIKE @MyComp
FETCH NEXT FROM CurSum INTO @MyNum ,@Id,@MyComp
END
CLOSE CurSum
DEALLOCATE CurSum
FETCH NEXT FROM CurComp INTO @MyComp
END
CLOSE CurComp
DEALLOCATE CurComp
/* SET NOCOUNT ON */
RETURN
|
В этой хранимке создается два курсора.
Курсор - это некий аналог датаридера (если работаете с VS, то должны знать, что это такое )
С помощью первого курсора мы создаем запрос , в котором выводим без повторов все компании в нашей таблице (Выделено жирным шрифтом)
DECLARE CurComp CURSOR FOR
SELECT DISTINCT MyComp FROM Table1OPEN CurComp
|
Этим курсором мы пробегаемся по нашей таблице и с помошью второго курсора апдейтим таблицу в нужных нам полях.
ЗЫ
Вааще-то правильней было сделать две таблицы - одна справочник организаций, а во второй только Id этих организаций. Но это дело вкуса.
Можете, кстати, так и сделать, а заодно потренируетесь на курсорах.{перепишите хранимку исходя из двух таблиц, а не одной}