【问题标题】:get calculation result from two columns in sql server从sql server中的两列获取计算结果
【发布时间】:2016-12-07 06:29:54
【问题描述】:

请参考下表。

 |RefNbr   | DocDate     | OrigAmt    | AdjAmt     | Balances |
 |INV001   | 2016-03-15  | 5,000.00   |   250.00   | 4,750.00 |
 |INV002   | 2016-03-16  | 5,000.00   |   750.00   | 4,000.00 |
 |INV003   | 2016-03-17  | 5,000.00   | 1,000.00   | 3,000.00 | 
 |INV004   | 2016-03-19  | 5,000.00   |   500.00   | 2,500.00 |

如何提供查询以获取余额值? (Balances = OrigAmt - AdjAmt(此规则仅适用于第一行),然后在第二行,Balances = Prev Balances(第一行的余额)- AdjAmt,等等)。

【问题讨论】:

  • 你有没有尝试过?您使用的是什么版本的 SQL Server?
  • 检查这个链接。它和你想要的一样enter link description here
  • @TimBiegeleisen:我使用 SQL Server 2014

标签: sql sql-server sql-server-2014 cumulative-sum


【解决方案1】:

这是使用窗口聚合函数的一种方法

select OrigAmt - sum(AdjAmt) over(order by  DocDate asc) as Balances 
From yourtable

对于低于 sql server 2012 的任何内容,请使用此

SELECT OrigAmt - cum_sum AS Balances
FROM   yourtable a
       CROSS apply (SELECT Sum(AdjAmt)
                    FROM   yourtable b
                    WHERE  b.DocDate <= a.DocDate) cs( cum_sum) 

【讨论】:

    【解决方案2】:

    试试下面的代码,它可能对你帮助不大。

    **

    CREATE TABLE #TAB(REFNBR VARCHAR(MAX),DOCDATE DATETIME ,ORIGAMT DECIMAL(18,2),ADJAMT DECIMAL(18,2))
     INSERT INTO #TAB VALUES ('INV001','2016-03-15',5000.00,250.00),('INV002','2016-03-16',5000.00,750.00),
     ('INV003','2016-03-17',5000.00,1000.00),('INV004','2016-03-19',5000.00,500.00)     
    
    
                ;WITH CTE AS (
    SELECT REFNBR, 
           DOCDATE,
           ORIGAMT,
           ADJAMT,
           ORIGAMT-ADJAMT AS BALANCE, 
           ROW_NUMBER() OVER ( ORDER BY DOCDATE) AS RN
    FROM #TAB)
    SELECT a.REFNBR,
           a.DOCDATE,
           a.ORIGAMT,
           a.ADJAMT,
           CASE WHEN ISNULL(LAG(a.BALANCE + ISNULL(x.ADDS,0)) OVER (ORDER BY a.RN),0) + a.ORIGAMT - a.ADJAMT < 0 
                THEN 0
                ELSE a.BALANCE + ISNULL(x.ADDS,0)
           END AS FINAL_BALANCE
    FROM CTE a
    CROSS APPLY (SELECT SUM(BALANCE) AS ADDS 
                    FROM CTE f 
                        WHERE f.REFNBR = a.REFNBR AND f.RN < a.RN
                        ) x
    

    **

    以上代码适用于 2014 年小于 2014 年的代码尝试一次以下代码

                    SELECT REFNBR,
           DocDate,
           OrigAmt,
           AdjAmt,
           CASE
             WHEN RNO > 1 THEN Sum(OrigAmt - ADJAMT)
                                 OVER(
                                   PARTITION BY REFNBR
                                   ORDER BY RNO)
             ELSE Iif(( OrigAmt - ADJAMT ) < 0, 0, OrigAmt - ADJAMT)
           END
    FROM   (SELECT *,
                   Row_number()
                     OVER(
                       PARTITION BY REFNBR
                       ORDER BY DocDate) AS RNO
            FROM   #TAB) A
    

    【讨论】:

    • 非常感谢您的回复,但我已经使用@Prdp 的查询解决了这个问题... :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多