我有一张表,order表吧 他有一个字段price 现在我用游标循环,对每一条的price都有一个操作,怎么得到这个price的总和?
是这样 我要用游标去循环,每一条游标的这列数据都会进行一个乘积运算,我是要得到这列数据乘积运算的总和
select sum(price) from order
可能我问的不太清楚,这个price要乘以一个折扣,所有的折扣额相加不能大于一个数值,最后做更新操作
现在怎么得到这个总数不太清楚
@SH一03: 在游标外面定义一个变量,这不是很简单么
@刘宏玺: 嗯,我定义了一个变量 但怎么在游标中得到累加值啊 用+=好像不对
@SH一03: 变量 = 变量 + 值
你都知道游标了,搜索一下一大堆的励志、栗子和梨子。我弄一段示例代码给你参考,
你自己修改成自己要的吧。
declare OrderCursor cursor for Select OrderDetailID, ProductID, OrderQuantity-DeliverQuantity, StockQuantity from OrderTable open OrderCursor fetch next from OrderCursor into @OrderDetailID, @CurrentProductID, @UndeliverQuantity, @StockQuantity while @@FETCH_STATUS =0 Begin ---- here you can use @OrderDetailID, @CurrentProductID, @UndeliverQuantity, @StockQuantity to calculate. ---- it is the result of each row value. fetch next from OrderCursor into @OrderDetailID, @CurrentProductID, @UndeliverQuantity, @StockQuantity end
ALTER PROCEDURE [dbo].[pro_buy]
-- Add the parameters for the stored procedure here
AS
BEGIN
DECLARE @uid INT --客户id
DECLARE @id int --声明一个用来接收顾客id的变量
DECLARE @g_id int --声明一个用来接收商品id的变量
DECLARE @gid INT --商品id
DECLARE @price MONEY --商品单价
DECLARE @minprice MONEY --区分计算后的商品单价
DECLARE @gnumber INT --商品数量
DECLARE @gname VARCHAR(20) --商品名
DECLARE @amount MONEY --总金额
DECLARE @salesdate DATE --日期
DECLARE @disNum INT --区分标识
DECLARE @dispercent FLOAT --折扣率
DECLARE @discount MONEY --最大折扣金额
DECLARE @rowDiscount MONEY --单件商品折扣额
DECLARE @discountMoney MONEY --商品折扣总金额
DECLARE @disMoney MONEY --剩余折扣额
DECLARE dis_orderCursor CURSOR --定义一个外部游标用来根据客户不同区分
FOR
SELECT
[UID] ,
gid ,
MAX(gname) AS gname,
SUM(gnumber) AS gnumber,
MIN(price) AS price,
SUM(amount) AS amount,
MIN(salesdate) AS salesdate
FROM
dbo.[order]
GROUP BY
[UID] ,
gid
ORDER BY
[UID],
gid
OPEN dis_orderCursor --打开游标
FETCH NEXT FROM dis_orderCursor INTO @uid,@gid,@gname,@gnumber,@price,@amount,@salesdate
WHILE @@FETCH_STATUS =0 --循环读取
BEGIN
INSERT INTO
dbo.[buy](
[uid] ,
gid,
gname ,
gnumber ,
price ,
amount,
salesdate
)
VALUES(
@uid ,
@gid ,
@gname ,
@gnumber ,
@price ,
@amount,
@salesdate
)
DECLARE dis_userCursor CURSOR
FOR
SELECT
dbo.[buy].[uid],
disNum
FROM
dbo.[buy] --订单表
LEFT JOIN dbo.[distinguish] --区分表
ON
dbo.[buy].UID = dbo.[distinguish].UID
OPEN dis_userCursor --打开游标
FETCH NEXT FROM dis_userCursor INTO @uid,@disNum
WHILE @@FETCH_STATUS =0 --循环读取
BEGIN
IF(@disNum =1)
BEGIN
SET @minprice =(@amount /@gnumber)
END
ELSE IF(@disNum =2)
BEGIN
SET @gnumber =(@amount /@price)
END
UPDATE dbo.[buy]
SET
gnumber =@gnumber ,price =@minprice
WHERE [uid] =@uid and gid=@gid and amount =@amount
--SET @id =@uid
--SET @g_id =@gid
DECLARE dis_discountCursor CURSOR
FOR
SELECT
dispercent, --折扣率
discount --最大折扣额
FROM
dbo.[buy] --订单表
LEFT JOIN dbo.[discountTable] --折扣表
ON
dbo.[buy].UID = dbo.[discountTable].UID
OPEN dis_discountCursor --打开游标
FETCH NEXT FROM dis_discountCursor INTO @dispercent,@discount
WHILE @@FETCH_STATUS =0 --循环读取
BEGIN
UPDATE dbo.[buy]
SET
discountMoney = @discountMoney---- 这里我要得到不同客户购买商品的总折扣额将它update到buy表中,就是这个不太好表示
WHERE [uid] =@uid and gid=@gid and amount =@amount
SET @id =@uid
SET @g_id =@gid
FETCH NEXT FROM dis_discountCursor INTO @dispercent,@discount
END
CLOSE dis_discountCursor --关闭
DEALLOCATE dis_discountCursor --删除
FETCH NEXT FROM dis_userCursor INTO @uid,@disNum
END
CLOSE dis_userCursor --关闭
DEALLOCATE dis_userCursor --删除
FETCH NEXT FROM dis_orderCursor INTO @uid,@gid,@gname,@gnumber,@price,@amount,@salesdate
END
CLOSE dis_orderCursor --关闭
DEALLOCATE dis_orderCursor --删除
END
你可以定义两个变量
set @sum=@sum+@num
这个@sum要先设置一个初始值吧
@SH一03: 对,设置成0就行
@星海之辉: 我是循环嵌套的 这个变量的设置是放在内层循环的外面还是外层循环的外面?
@SH一03: @sum是要放在声明游标的外面,来计算各种价格之和
@星海之辉: 放在while前面可以吗 我是要在内层循环中得到总值
这个没必要使用游标