T-SQL выберите переменную процесса - PullRequest
0 голосов
/ 09 декабря 2010

В SQL Server 2008 у меня есть таблица - фрукты

Items   Orders
Bananas 6
Bananas 2
Bananas 1
Mangos  4
Mangos  3
Apples  7
Apples  1
Apples  3
Apples  3

Используя переменные, как я могу получить ниже вывод. Я запрашиваю переменные, потому что хотел бы выполнить несколько математических операций, не описанных в этом примере.

Items   Number of Orders    Total Order Quantity    Average Order Quantity
Bananas 3   9   3
Mangos  2   7   3.5
Apples  4   14  3.5

«Общее количество заказов» показывает сумму всех заказов для данного товара «Среднее количество заказов» = «Общее количество заказов» / «Количество заказов»

Большое спасибо.

Create table Fruits (Items varchar(10), Orders int)

insert into Fruits values ('Bananas',6)
insert into Fruits values ('Bananas',2)
insert into Fruits values ('Bananas',1)
insert into Fruits values ('Mangos',4)
insert into Fruits values ('Mangos',3)
insert into Fruits values ('Apples',7)
insert into Fruits values ('Apples',1)
insert into Fruits values ('Apples',3)
insert into Fruits values ('Apples',3)

Ответы [ 3 ]

2 голосов
/ 09 декабря 2010
select Items, count(Orders) as NumberOfOrders, sum(Orders) as TotalOrderQuantity, avg(Orders + 0.0) as AverageOrderQuantity
from Fruits
group by Items
0 голосов
/ 09 декабря 2010

Да, действительно следует избегать курсоров, когда это возможно.Примерно такой подход, вероятно, был бы лучше всего: хранить результаты запроса во временной таблице, а затем запускать операторы обновления для получения ваших вычислений:

 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
0 голосов
/ 09 декабря 2010
declare csrCursor cursor for
    select Items, count(Orders) as NumberOfOrders, sum(Orders) as TotalOrderQuantity, avg(Orders + 0.0) as AverageOrderQuantity
    from Fruits
    group by Items
    order by 1

declare @Item varchar(10)
declare @OrderCount int
declare @QuantityTotal int
declare @AvgQuantity numeric(9, 2)

open csrCursor

fetch next from csrCursor into @Item, @OrderCount, @QuantityTotal, @AvgQuantity
while (@@fetch_status = 0)
    -- Do stuff with variables @Item, @OrderCount, @QuantityTotal, @AvgQuantity
    -- Insert results in Temp Table

    fetch next from csrCursor into @Item, @OrderCount, @QuantityTotal, @AvgQuantity
end

close csrCursor
deallocate csrCursor
...