2017-02-14 2 views
1

Это SQL QueryЧтобы вычесть предыдущее значение строки в 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 Server, прочитав это: 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) 
Смежные вопросы