有数据:
料号     跟踪号     需求数    库存数   调整数
A                    4000    2000      2000      
A         111        4000    3000     2000
B                    6000    2000     2000
B        333         6000    2000     2000
 
以上如A物料,第一行需求数4000,实际库存只有2000,所以调整数是2000
第二行4000剩下2000,调整2000B物料第一行库存数2000调整2000,需求还有4000,但第二行库存数只有2000所以也只能调整2000以上是各行数据,要求是根据那些算出调整数,列在每行后。谢谢

解决方案 »

  1.   

    --> 测试数据:[tb]
    IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
    GO
    CREATE TABLE [tb]([料号] VARCHAR(1),[跟踪号] INT,[需求数] INT,[库存数] INT)
    INSERT [tb]
    SELECT 'A',NULL,4000,2000 UNION ALL
    SELECT 'A',111,4000,3000 UNION ALL
    SELECT 'B',NULL,6000,2000 UNION ALL
    SELECT 'B',333,6000,2000
    GO--> 测试语句:
    ; with t as
    (
    select *,
    [调整数]= case when [需求数]>[库存数] then [库存数] else [库存数]-[需求数]end,
    [余数]=[需求数]-(case when [需求数]>[库存数] then [库存数] else [库存数]-[需求数] end)
    from [tb] where [跟踪号] is null
    union all
    select 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        2000
    A    111         4000        3000        2000
    B    NULL        6000        2000        2000
    B    333         6000        2000        2000(4 行受影响)
    */
      

  2.   


    --> 测试数据:[tb]
    IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmp
    GO
    CREATE TABLE #tmp (物料 VARCHAR(50),跟踪号 VARCHAR(50),[需求数] INT,[库存数] INT)
    INSERT #tmp
    SELECT '01.01.02.M003EVAN',NULL,4000,2000 UNION ALL
    SELECT '01.01.02.M003EVAN','预测001',4000,3000 UNION ALL
    SELECT '01.01.04.MC051EVAN',NULL,4000,10000 UNION ALL
    SELECT '01.03.06.P03018EVAN',NULL,4000,50000
    GO--> 测试语句:
    with t as
    (
    select *,
    [调整数]= case when [需求数]>[库存数] then [库存数] else [库存数]-[需求数]end,
    [余数]=[需求数]-(case when [需求数]>[库存数] then [库存数] else [库存数]-[需求数] end)
    from #tmp where [跟踪号] is null
    union all
    select 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 [物料]兄台麻烦帮忙看一下,最后两笔为什么是库存数-需求数了,这两行是不同的物料,需要调整的是需求数,因为需求数小,如果需求数大才按库存数来作为调整数,谢谢
      

  3.   

    一行行扣减这种问题最好是用CTE来实现,具体可以看联机丛书,有例子的。CTE是处理递归逻辑的优先选择方法。用游标的话在大数据量的情况下死定了
      

  4.   


    --> 测试数据:[tb]
    IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmp
    GO
    CREATE TABLE #tmp (物料 VARCHAR(50),跟踪号 VARCHAR(50),[需求数] INT,[库存数] INT)
    INSERT #tmp
    SELECT '01.01.02.M003EVAN',NULL,4000,2000 UNION ALL
    SELECT '01.01.02.M003EVAN','预测001',4000,3000 UNION ALL
    SELECT '01.01.04.MC051EVAN',NULL,4000,10000 UNION ALL
    SELECT '01.03.06.P03018EVAN',NULL,4000,50000
    GO--> 测试语句:
    with t as
    (
    select *,
    [调整数]= case when [需求数]>[库存数] then [库存数] else [需求数]end,
    [余数]=[需求数]-(case when [需求数]>[库存数] then [库存数] else [需求数] end)
    from #tmp where [跟踪号] is null
    union all
    select 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 [物料]
      

  5.   

    你不结贴继续问,我鄙视你
    还有这个CSDN也太奇怪了,刚才打开只显示了三楼,经常有不显示的