2016-09-20 3 views
1

У меня есть таблица с столбцами Position_Date, Deal_Nr и рыночной стоимостью. Теперь я хочу создать четвертый столбец, который вычисляет Дельта рыночной стоимости между 2 днями на каждой сделке. Например, сделка № 100, МВ 14/9 = 500. МВ 13/9 = 600. 500-600 = -100 ...Запуск значения Delta на выделенных строках - SQL Server 2008

Я знаю, как это сделать, если я суммирую и группирую дату позиции, но есть способ рассчитать дельта, изолированную на каждой сделке, не делая случая и помещая deal_nr в качестве условия? У меня есть 100 различных deal_nr, и новые сделки придут, поэтому я хочу, чтобы запрос был статичным.

 Position_date |Deal_Nr| Market Value | Delta Market Value 
     2016-09-14 | 100 | 500    | -100 
     2016-09-14 | 101 | 1000   | 200 
     2016-09-14 | 102 | 120    | -30 
     2016-09-14 | 103 | 400    | -40 
     2016-09-13 | 100 | 600    | -300 
     2016-09-13 | 101 | 800    | 100 
     2016-09-13 | 102 | 150    | -150 
     2016-09-13 | 103 | 440    | 240 
     2016-09-12 | 100 | 900    | N/A 
     2016-09-12 | 101 | 700    | N/A 
     2016-09-12 | 102 | 300    | N/A 
     2016-09-12 | 103 | 200    | N/A 

Если бы я рассчитывал агрегированную дельта, сгруппированную по дате позиции, то следующие работы.

  Select 
     Position_date, 
     Market_Value, 
     Delta_MV = sum(Market_value) - (select sum(Market_value) from t1 
             where position_Date = a.position_date -1 
             Group by position_date) 

     from t1 as a 
     Group by position_date 
+0

Не могли бы вы написать свой ожидаемый результат. я имею в виду то, что вы хотите показать –

ответ

1

Вы должны использовать LEFT JOIN как ниже:

DECLARE @Tbl TABLE (Position_date DATETIME, MarketValue INT, Deal_Nr INT) 
INSERT INTO @Tbl 
VALUES 
('2016-09-14', 500 ,100 ), 
('2016-09-14', 1000,101 ), 
('2016-09-14', 120 ,102 ), 
('2016-09-14', 400 ,103 ), 
('2016-09-13', 600 ,100 ), 
('2016-09-13', 800 ,101 ), 
('2016-09-13', 150 ,102 ), 
('2016-09-13', 440 ,103 ), 
('2016-09-12', 900 ,100 ), 
('2016-09-12', 700 ,101 ), 
('2016-09-12', 300 ,102 ), 
('2016-09-12', 200 ,103 ) 

SELECT 
    A.Position_date, 
    A.MarketValue, 
    A.MarketValue - B.MarketValue AS DeltaMarketValue  
FROM 
    @Tbl A LEFT JOIN 
    @Tbl B ON A.Deal_Nr = B.Deal_Nr AND 
       A.Position_date <> B.Position_date AND 
       DATEADD(DAY, -1, A.Position_date) = B.Position_date 

Результат:

Position_date MarketValue DeltaMarketValue 
--------------- ----------- ---------------- 
2016-09-14   500   -100 
2016-09-14   1000  200 
2016-09-14   120   -30 
2016-09-14   400   -40 
2016-09-13   600   -300 
2016-09-13   800   100 
2016-09-13   150   -150 
2016-09-13   440   240 
2016-09-12   900   NULL 
2016-09-12   700   NULL 
2016-09-12   300   NULL 
2016-09-12   200   NULL 
+0

@haggan Если таблица имеет первичный ключ. Используйте 'A.Id <> B.Id' вместо' A.Position_date <> B.Position_date' – NEER

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

  • Нет связанных вопросов^_^