• 分配数量/金额


    最近我会遇到这样一个问题,类似于将发票上的金额分配到单据上。我将解决的核心部分抽取出来,在此做个标记。
    注:最后一列是我们想要的值
    aId aCode aAmt bId bCode bAmt bRealAmt
    1 xout0001 900.00 1 pin0001 500.00 500.00
    1 xout0001 900.00 2 pin0002 200.00 200.00
    2 xout0002 500.00 3 pin0003 600.00 500.00
    2 xout0002 500.00 4 pin0004 100.00 0.00
    3 xout0003 600.00 5 pin0005 600.00 600.00

    CREATE TABLE tInvoice
        (
          OID 
    BIGINT IDENTITY,
          vCode 
    NVARCHAR(50),
          vName 
    NVARCHAR(50),
          dcAmt 
    DECIMAL(3810)
        )
    GO

    CREATE TABLE tBill
        (
          OID 
    BIGINT IDENTITY,
          vCode 
    NVARCHAR(50),
          lInvoiceId 
    BIGINT,
          dcAmt 
    DECIMAL(3810),
          dcRealAmt 
    DECIMAL(3810)
        )
    GO

    INSERT  INTO tInvoice ( vCode, vName, dcAmt )
    SELECT  'xout0001''xout0001'900
    UNION
    SELECT  'xout0002''xout0002'500
    UNION
    SELECT  'xout0003''xout0003'600

    INSERT  INTO tBill (vCode, lInvoiceId, dcAmt)
            
    SELECT  'pin0001'1500
            
    UNION
            
    SELECT  'pin0002'1200
            
    UNION
            
    SELECT  'pin0003'2600
            
    UNION
            
    SELECT  'pin0004'2100
            
    UNION
            
    SELECT  'pin0005'3600

    UPDATE  T1
    SET     T1.dcRealAmt = 
            
    CASE WHEN T2.dcAmt >= ISNULL(( SELECT    SUM(t.dcAmt)
                                          
    FROM      tBill AS t
                                          
    WHERE     t.lInvoiceId = T1.lInvoiceId
                                                    
    AND t.OID <= T1.OID
                                        ), 
    0THEN T1.dcAmt
                
    WHEN T2.dcAmt <= ISNULL(( SELECT    SUM(t.dcAmt)
                                          
    FROM      tBill AS t
                                          
    WHERE     t.lInvoiceId = T1.lInvoiceId
                                                    
    AND t.OID < T1.OID
                                        ), 
    0THEN 0
                
    ELSE T2.dcAmt
                     
    - ISNULL(( SELECT  SUM(t.dcAmt)
                                
    FROM    tBill AS t
                                
    WHERE   t.lInvoiceId = T1.lInvoiceId
                                        
    AND t.OID < T1.OID
                              ), 
    0)
           
    END
    FROM    tBill AS T1
            
    JOIN tInvoice AS T2 ON T1.lInvoiceId = T2.OID

    SELECT  a.OID, a.vCode, a.vName, a.dcAmt, b.OID, b.vCode, b.dcAmt, b.dcRealAmt
    FROM    tInvoice AS a
        
    JOIN tBill AS b ON a.OID = b.lInvoiceId
        

    --DROP TABLE tBill
    --
    DROP TABLE tInvoice    
     

  • 相关阅读:
    上班5个月总结
    使用余弦定理计算两篇文章的相似性
    9月10日 小结
    软件测试
    《增长黑客》笔记
    统计学术语
    数据分析师:数据分析工作常见七种错误及其规避技巧(转自经管之家)
    输入一个日期,计算这个日期与 2018-03-12差多少天;
    求输入数字的阶乘 及加和 #s=1!+2!+3!+…..+n!
    列表去重
  • 原文地址:https://www.cnblogs.com/zhaoguan_wang/p/1663793.html
Copyright © 2020-2023  润新知