`
xiaoer_1982
  • 浏览: 1821295 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

逐行更新汇总更新实例

阅读更多

______________________________________________________________________________________
名称 | 日期 | 之前量 | 入库 | 出库 | 当前量 | 单位 |
--------------------------------------------------------------------------------------
电脑 |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 行受影响)
*/

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics