逐行更新汇总更新实例
2009-09-03 08:10
218 查看
______________________________________________________________________________________
名称 | 日期 | 之前量 | 入库 | 出库 | 当前量 | 单位 |
--------------------------------------------------------------------------------------
电脑 |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 行受影响)
*/
名称 | 日期 | 之前量 | 入库 | 出库 | 当前量 | 单位 |
--------------------------------------------------------------------------------------
电脑 |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 行受影响)
*/
相关文章推荐
- 通过变量逐行更新实例
- XCODE快捷键和功能汇总篇(不断更新)
- [置顶] Android 开发问题汇总(持续更新)
- 汇总这一年半我所使用过的那些工具[持续更新中]
- 正则汇总 个人汇总 不断更新中
- Win10预览版14251更新后会出现哪些新bug? 已知问题汇总
- Android开发经典笔试面试题汇总(持续更新中)
- linux 常用命令汇总(更新中)
- 前端浏览器兼容性问题汇总,持续更新中。。。。
- iOS开发中遇到的小知识点汇总(持续更新)
- 基于BM3803处理器平台的PCI软硬件调试问题汇总(持续更新中)
- C++常用字符串分割方法实例汇总
- 大数据系列文章汇总 - 更新到15篇
- VB.NET实现程序在线更新的实例
- Android应用App更新实例详解
- 【java】Maven项目开发中常用的依赖包汇总,不断更新
- HTML5资源汇总(更新游戏引擎cocos2d-html5)
- Android 学习问题汇总,不断更新
- python之matplotlib学习绘制动态更新图实例代码
- 《机器学习实战》中实例名称汇总