逐行更新汇总更新实例

______________________________________________________________________________________
    名称    |  日期  |  之前量    |    入库    |    出库    |  当前量  |  单位 |
--------------------------------------------------------------------------------------
    电脑    |2009-8-01 |    100      |    1      |    5      |    96      |  台  |
--------------------------------------------------------------------------------------
    电脑    |2009-8-02 |    100      |    0      |    1      |    99      |  台  |
--------------------------------------------------------------------------------------
    电脑    |2009-8-03 |    100      |    10    |    0      |    110    |  台  |
______________________________________________________________________________________

字段为:
  pc_name      date_chr    liang_zq        rk          ck          liang_mq    danw

现在要求:每行的"之前量"=上一天的"当前量"; 当天的"当前量"="之前量"+入库-出库  (上面8-1号的"之前量"为起始量)

问下各位,这个SQL语句该怎么写?

http://topic.csdn.net/u/20090902/18/334bc901-2fa8-483f-87fe-b424f750031f.html?38688

 

--> 生成测试数据: @tb
DECLARE @tb TABLE (名称 VARCHAR(4),日期 DATETIME,之前量 INT,入库 INT,出库 INT,当前量 INT,单位 VARCHAR(2))
INSERT INTO @tb
SELECT '电脑','2009-8-01',100,1,5,96,'' UNION ALL
SELECT '电脑','2009-8-02',100,0,1,99,'' UNION ALL
SELECT '电脑','2009-8-03',100,10,0,110,'' UNION ALL

SELECT 'CPU','2009-8-01',900,1,5,96,'' UNION ALL
SELECT 'CPU','2009-8-02',100,20,1,99,'' UNION ALL
SELECT 'CPU','2009-8-03',100,10,50,110,''

--SQL查询如下:

declare @pre_value int,@cur_value int;
declare @name varchar(20);

update @tb set
   
@pre_value = case when @name = 名称 then @cur_value else 之前量 end,
   
@cur_value = isnull(@pre_value,0) + 入库-出库,
    之前量
= @pre_value,
    当前量
= @cur_value,
   
@name = 名称;

SELECT * FROM @tb;

/*
名称   日期                      之前量         入库          出库          当前量         单位
---- ----------------------- ----------- ----------- ----------- ----------- ----
电脑   2009-08-01 00:00:00.000 100         1           5           96          台
电脑   2009-08-02 00:00:00.000 96          0           1           95          台
电脑   2009-08-03 00:00:00.000 95          10          0           105         台
CPU  2009-08-01 00:00:00.000 900         1           5           896         台
CPU  2009-08-02 00:00:00.000 896         20          1           915         台
CPU  2009-08-03 00:00:00.000 915         10          50          875         台

(6 row(s) affected)

*/
-------------------------------------------------------------------------

--> 生成测试数据表:tb

If not object_id('[tb]') is null
   
Drop table [tb]
Go
Create table [tb](pc_name nvarchar(3),date_chr Datetime,liang_zq int,rk int,ck int,liang_mq int,danw nvarchar(1))
Insert [tb]
Select N'电脑','2009-8-01',100,1,5,96,N'' union all
Select N'电脑','2009-8-02',100,0,1,99,N'' union all
Select N'电脑','2009-8-03',100,10,0,110,N'' union all
SELECT 'CPU','2009-8-01',900,1,5,96,'' UNION ALL
SELECT 'CPU','2009-8-02',100,20,1,99,'' UNION ALL
SELECT 'CPU','2009-8-03',100,10,50,110,''

Go
--Select * from [tb]

-->SQL查询如下:
update t set
    liang_zq
=(select SUM(rk-ck) from tb where pc_name=t.pc_name and date_chr<=t.date_chr)+(select top 1 liang_zq from tb where pc_name=t.pc_name order by date_chr) +ck-rk,
    liang_mq
=(select SUM(rk-ck) from tb where pc_name=t.pc_name and date_chr<=t.date_chr)+(select top 1 liang_zq from tb where pc_name=t.pc_name order by date_chr)
from tb t

select * from tb
/*
pc_name date_chr                liang_zq    rk          ck          liang_mq    danw
------- ----------------------- ----------- ----------- ----------- ----------- ----
电脑      2009-08-01 00:00:00.000 100         1           5           96          台
电脑      2009-08-02 00:00:00.000 96          0           1           95          台
电脑      2009-08-03 00:00:00.000 95          10          0           105         台
CPU     2009-08-01 00:00:00.000 900         1           5           896         台
CPU     2009-08-02 00:00:00.000 896         20          1           915         台
CPU     2009-08-03 00:00:00.000 915         10          50          875         台

(6 行受影响)
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值