--------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-01-06 08:54:41
-- Version:Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
-- Mar 29 2009 10:27:29
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
--------------------------------------------------------------------------
--> 生成测试数据表:tb
IF NOT OBJECT_ID('[存货表]') IS NULL
DROP TABLE [存货表]
GO
CREATE TABLE [存货表]([编码] NVARCHAR(10),[数量] INT,[单价] DECIMAL(18,1),[日期] DATETIME)
INSERT [存货表]
SELECT '01',5,2.2,N'2009-10-01' UNION ALL
SELECT '01',9,2.5,N'2009-10-01' UNION ALL
SELECT '01',12,2.1,N'2009-10-02' UNION ALL
SELECT '02',20,15.2,N'2009-10-20' UNION ALL
SELECT '02',16,12.8,N'2009-10-20'
GO
--SELECT * FROM [存货表]
--> 生成测试数据表:销售表
IF NOT OBJECT_ID('[销售表]') IS NULL
DROP TABLE [销售表]
GO
CREATE TABLE [销售表]([编码] NVARCHAR(10),[销售数量] INT)
INSERT [销售表]
SELECT '01',8 UNION ALL
SELECT '02',30
GO
--SELECT * FROM [销售表]
-->SQL查询如下:
;with t as
(
select rn=ROW_NUMBER()over(Order by 编码,日期),*
from 存货表
),t1 as
(
select *,tmpsum=(select SUM(数量) from t where 编码=a.编码 and rn<=a.rn)
from t a
)
update a set
a.数量=a.数量-case
when a.数量-(a.tmpsum-b.销售数量) <=0 then 0
when a.tmpsum-b.销售数量 <=0 then a.数量
else a.数量-(a.tmpsum-b.销售数量)
end
from t1 a
join 销售表 b
on a.编码=b.编码
select * from 存货表
/*
编码 数量 单价 日期
---------- ----------- --------------------------------------- -----------------------
01 0 2.2 2009-10-01 00:00:00.000
01 6 2.5 2009-10-01 00:00:00.000
01 12 2.1 2009-10-02 00:00:00.000
02 0 15.2 2009-10-20 00:00:00.000
02 6 12.8 2009-10-20 00:00:00.000
(5 行受影响)
*/
/*---------------------------------------------------
以下简例为查询实际应发数,以下测试数据s 表示数量,c 表示仓库。
假设某物料要出100个,求从各仓库分别应发出多少数量。
----------------------------------------------------*/
--> 生成测试数据表: [tb] IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb] GO CREATE TABLE [tb] ([id] [int],[s] [int],[c] [int]) INSERT INTO [tb] SELECT '1','20','1' UNION ALL SELECT '2','30','2' UNION ALL SELECT '3','80','3' UNION ALL SELECT '4','30','4' --SELECT * FROM [tb] -->SQL查询如下: DECLARE @i INT = 100 SELECT id, s = CASE WHEN l>0 THEN s WHEN s+l<0 THEN 0 ELSE s+l END, c FROM ( SELECT *, @i-( SELECT SUM(s) FROM tb WHERE id<= a.id ) l FROM tb a ) t /* id s c ----------- ----------- ----------- 1 20 1 2 30 2 3 50 3 4 0 4 (4 行受影响) */