Да, действительно следует избегать курсоров, когда это возможно.Примерно такой подход, вероятно, был бы лучше всего: хранить результаты запроса во временной таблице, а затем запускать операторы обновления для получения ваших вычислений:
declare @Table table
(
@Item varchar(10)
@OrderCount int
@QuantityTotal int
@AvgQuantity numeric(9, 2)
@Calc1 numeric(9, 2)
@Calc2 numeric(9, 2)
)
insert into @Table (@Item, @OrderCount, @QuantityTotal, @AvgQuantity)
select Items, count(Orders) as NumberOfOrders, sum(Orders) as TotalOrderQuantity, avg(Orders + 0.0) as AverageOrderQuantity
from Fruits
group by Items
order by 1
update @Table set @Calc1 = @OrderCount / @AvgQuantity,
@Calc2 = ...
select * from @Table
или если вы можете получить все свои вычисления в одномстрока или соединение с другой таблицей, вы можете сделать это в одном выражении, например:
select *, (OrderCount / AvgQuantity) as Calc1, (... as Calc2)
from
(
select Items, count(Orders) as OrderCount, sum(Orders) as TotalQuantity, avg(Orders + 0.0) as AvgQuantity
from Fruits
group by Items
) t