首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

在多行数据中,一行行扣减数量的兑现

2012-09-21 
在多行数据中,一行行扣减数量的实现有数据:料号跟踪号需求数库存数调整数A400020002000A111400030002000B6

在多行数据中,一行行扣减数量的实现
有数据:
料号           跟踪号           需求数         库存数       调整数
A                                         4000         2000             2000            
A                   111                 4000         3000           2000
B                                         6000         2000           2000
B                 333                   6000         2000           2000
 
以上如A物料,第一行需求数4000,实际库存只有2000,所以调整数是2000
第二行4000剩下2000,调整2000

B物料第一行库存数2000调整2000,需求还有4000,但第二行库存数只有2000所以也只能调整2000

以上是各行数据,要求是根据那些算出调整数,列在每行后。谢谢

[解决办法]

SQL code
--> 测试数据:[tb]IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]GOCREATE TABLE [tb]([料号] VARCHAR(1),[跟踪号] INT,[需求数] INT,[库存数] INT)INSERT [tb]SELECT 'A',NULL,4000,2000 UNION ALLSELECT 'A',111,4000,3000 UNION ALLSELECT 'B',NULL,6000,2000 UNION ALLSELECT 'B',333,6000,2000GO--> 测试语句:; with t as(select *,[调整数]= case when [需求数]>[库存数] then [库存数] else [库存数]-[需求数]end,[余数]=[需求数]-(case when [需求数]>[库存数] then [库存数] else [库存数]-[需求数] end)from [tb] where [跟踪号] is nullunion allselect b.*,[调整数]=case when [余数]<b.[库存数] then [余数] else b.[库存数] end,[余数]=(case when [余数]<b.[库存数] then [余数] else b.[库存数] end)-t.[余数]from t,tb as b where b.[料号]=t.[料号] and b.[跟踪号] is not null and [余数]>0)select [料号],[跟踪号],[需求数],[库存数],[调整数]from t order by [料号]/*料号   跟踪号         需求数         库存数         调整数---- ----------- ----------- ----------- -----------A    NULL        4000        2000        2000A    111         4000        3000        2000B    NULL        6000        2000        2000B    333         6000        2000        2000(4 行受影响)*/
[解决办法]
另外,你楼上的不是兄台,如果资料没错的话ta是个女的。
[解决办法]
SQL code
--> 测试数据:[tb]IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmpGOCREATE TABLE #tmp (物料 VARCHAR(50),跟踪号 VARCHAR(50),[需求数] INT,[库存数] INT)INSERT #tmpSELECT '01.01.02.M003EVAN',NULL,4000,2000 UNION ALLSELECT '01.01.02.M003EVAN','预测001',4000,3000 UNION ALLSELECT '01.01.04.MC051EVAN',NULL,4000,10000 UNION ALLSELECT '01.03.06.P03018EVAN',NULL,4000,50000GO--> 测试语句:with t as(select *,[调整数]= case when [需求数]>[库存数] then [库存数] else [需求数]end,[余数]=[需求数]-(case when [需求数]>[库存数] then [库存数] else [需求数] end)from #tmp where [跟踪号] is nullunion allselect b.*,[调整数]=case when [余数]<b.[库存数] then [余数] else b.[库存数] end,[余数]=(case when [余数]<b.[库存数] then [余数] else b.[库存数] end)-t.[余数]from t,#tmp as b where b.[物料]=t.[物料] and b.[跟踪号] is not null and [余数]>0)select [物料],[跟踪号],[需求数],[库存数],[调整数]from t order by [物料] 

热点排行