2010-12-08 57 views
0

在SQL Server 2008中我有一个表-1水果T-SQL选择过程变量

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) 
+0

你可以描述数学运算?机会是可以以基于集合的方式完成的。除非您计划以RBAR方式进行处理,否则使用变量将限制您达到固定的最大数量的水果。 – 2010-12-08 21:34:41

+0

谢谢戈登贝尔。在真实场景中,我想对“订单数量”和“总订购数量”执行加减操作,并将其显示为列 – user219628 2010-12-08 21:51:35

+0

是否可以在不使用光标的情况下解决此问题?我所处理的表格有数百万条记录,并且非常重要。 – user219628 2010-12-08 21:53:14

回答

0

是的,真的应该避开光标可能时。这样的做法的东西很可能是最好的,存储查询的结果在临时表中,然后运行update语句让你算了一笔账:

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 
2
select Items, count(Orders) as NumberOfOrders, sum(Orders) as TotalOrderQuantity, avg(Orders + 0.0) as AverageOrderQuantity 
from Fruits 
group by Items 
0
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