2016-08-05 4 views
0

Я ищу для SQL-запроса, чтобы вычислить разницу между двумя значениями, как в следующем примере:SQL запрос, чтобы получить разницу между значениями из двух строк

Date  | OrderNr | TotalDelivered | -> DeliveredToday 
01.08.2016 | 123  | 1000   | -> 1000 
01.08.2016 | 456  | 250   | -> 250 
01.08.2016 | 789  | 3400   | -> 3400 
02.08.2016 | 123  | 1300   | -> 300 
02.08.2016 | 456  | 400   | -> 150 
02.08.2016 | 789  | 4000   | -> 600 
05.08.2016 | 123  | 1300   | -> 0 
05.08.2016 | 456  | 500   | -> 100 
05.08.2016 | 789  | 4050   | -> 50 

Таким образом, запрос должен автоматически рассчитает Значение «DeliveredToday» для каждого OrderNr и каждый день.

Возможно ли это?

Спасибо за вашу помощь

+1

Какова логика этого? – Jens

+0

Да, в чем логика, а также вы можете отправить запрос, который вы пытались написать? –

ответ

1

Вы можете использовать LAG function для доступа к предыдущей строке того же порядка, а затем рассчитать разницу:

SELECT t.Date, 
    t.OrderNr, 
    t.TotalDelivered, 
    t.TotalDelivered - t.PreviousDelivered as DeliveredToday 
FROM 
    (SELECT 
     Date, 
     OrderNr, 
     TotalDelivered, 
     LAG(TotalDelivered, 1, 0) OVER (PARTITION BY OrderNr ORDER BY Date ASC) AS PreviousDelivered 
    FROM tableName 
    ) t 

Здесь в подзапросе я использовал функцию LAG, чтобы получить предыдущее значение от TotalDelivered за тот же порядок (уточняется PARTITION BY OrderNr) и упорядочивается по дате (ORDER BY Date ASC). Затем во внешнем запросе я вычитаю значение PreviousDelivered из TotalDelivered, а результат - количество поставленных сегодня.

Edit: Как @SandipPatel упоминалось в комментариях, можно не использовать подзапрос:

SELECT 
     Date, 
     OrderNr, 
     TotalDelivered, 
     TotalDelivered-LAG(TotalDelivered, 1, 0) OVER (PARTITION BY OrderNr ORDER BY Date ASC) AS PreviousDelivered 
FROM tableName 
+0

Хорошо, вы можете прямо использовать инструкцию подзапроса без запроса верхнего выбора –

+0

@SandipPatel Да, вы могли бы написать все без подзапроса, но я думал, что код будет более понятным с подзапросом – dotnetom

+0

Могу ли я узнать, откуда я могу найти этот тип function like (lag), я не могу найти в своей системной функции по умолчанию для SQL Server –

Смежные вопросы