2017-02-14 22 views
1

這是SQL查詢要減去在SQL Server上一行值2012

SELECT 
    ROW_NUMBER() OVER (ORDER BY (SELECT 1)) [Sno], 
    _Date, 
    SUM(Payment) Payment 
FROM 
    DailyPaymentSummary 
GROUP BY 
    _Date 
ORDER BY 
    _Date 

這將返回輸出這樣

Sno _Date  Payment 
--------------------------- 
1 2017-02-02 46745.80 
2 2017-02-03 100101.03 
3 2017-02-06 140436.17 
4 2017-02-07 159251.87 
5 2017-02-08 258807.51 
6 2017-02-09 510986.79 
7 2017-02-10 557399.09 
8 2017-02-13 751405.89 
9 2017-02-14 900914.45 

我怎樣才能像下面

Sno _Date  Payment  Diff 
-------------------------------------- 
1 02/02/2017 46745.80 46745.80 
2 02/03/2017 100101.03 53355.23 
3 02/06/2017 140436.17 40335.14 
4 02/07/2017 159251.87 18815.70 
5 02/08/2017 258807.51 99555.64 
6 02/09/2017 510986.79 252179.28 
7 02/10/2017 557399.09 46412.30 
8 02/13/2017 751405.89 194006.80 
9 02/14/2017 900914.45 149508.56 
其他列

我試過以下查詢,但無法解決錯誤

WITH cte AS 
(
    SELECT 
     ROW_NUMBER() OVER (ORDER BY (SELECT 1)) [Sno], 
     _Date, 
     SUM(Payment) Payment 
    FROM 
     DailyPaymentSummary 
    GROUP BY 
     _Date 
    ORDER BY 
     _Date 
) 
SELECT 
    t.Payment, 
    t.Payment - COALESCE(tprev.col, 0) AS diff 
FROM 
    DailyPaymentSummary t 
LEFT OUTER JOIN 
    t tprev ON t.seqnum = tprev.seqnum + 1; 

任何人都可以幫我嗎?

+0

你可能想看看SQL服務器「窗口函數」,通過閱讀這篇:http://sqlmag.com/sql-server-2012/how-use-microsoft-sql-server-2012s-window-functions-part-1 – pmbAustin

+0

要訪問「上一個」行,可以使用LAG。 https://msdn.microsoft.com/en-us/library/hh231256.aspx –

+0

請記住,您需要比(選擇1)更好的順序。這是一個無用的順序,並不總是以相同的順序返回你的行。你應該使用合理的專欄。在你的情況像Sno或_Date。 –

回答

2

通過使用順序與列(一個或多個),以獲得一致的結果。

使用lag函數來獲取從以前的行數據,做這樣的減法:

with t 
as (
    select ROW_NUMBER() over (order by _date) [Sno], 
     _Date, 
     sum(Payment) Payment 
    from DailyPaymentSummary 
    group by _date 
    ) 
select *, 
    Payment - lag(Payment, 1, 0) over (order by [Sno]) diff 
from t; 
+0

非常感謝,標記爲答案 – Aruna

1

您可以使用滯後()來獲取以前行值

coalesce(lag(sum_payment_col) OVER (ORDER BY (SELECT 1)),0)