2016-04-19 3 views
1

У меня есть таблица вроде этого:Вычислить diffrences между значениями из diffrent строк в SQL

Month_Date Account Cash 
1   2222 5000 
2   2222 6000 
3   2222 7000 
4   2222 10000 
2   1111 5000 
3   1111 7000 
4   1111 8000 

И мой желаемый результат должен быть таким:

Month_Date Account Cash diff 
1   2222 5000 NA 
2   2222 6000 1000/5000= 0.2 
3   2222 7000 1000/6000= 0.16 
4   2222 10000 3000/7000 = 0.42 
2   1111 5000 NA 
3   1111 7000 2000/5000= 0.4 
4   1111 8000 1000/7000= 0.14 

Без расчета курса. Не все учетные записи имеют данные с 1-го месяца, см. Счет 1111, поэтому я думаю о ранжировании их. Я ищу что-то вроде вычитания и разделения строк над разделом учетной записи.

Select Month_Date, Account, Cash, 
rank() over (Partition by Month_Date, Account) order by Month_Date as Rnk, 
Diff = 
case when Rnk = 1 then 'NA' else ???? 

Любые предложения, как это сделать?

+0

, что является причиной 3000/10000? – TheGameiswar

+0

Извините, набрав ошибку. – Jordan1200

ответ

1

Для Перед SQL Server 2012

SELECT 
    M.Month_Date, 
    M.Account, 
    M.Cash, 
    Diff = X.Cash - M.Cash 
FROM 
    MyTable M 
    OUTER APPLY 
    (SELECT TOP 1 
     * 
    FROM 
     MyTable M2 
    WHERE 
     M.Account = M2.Account 
     AND 
     M.Month_Date < M2.Month_Date 
    ORDER BY 
     Month_Date 
    ) X 
1

Для SQL Server 2012+ можно использовать LAG/LEAD функции. В SQL Server 2008 вы можете использовать outer apply оператор для определения предыдущей строки:

DECLARE @t TABLE 
    (
     Month_Date INT , 
     Account INT , 
     Cash INT 
    ) 
INSERT INTO @t 
VALUES (1, 2222, 5000), 
     (2, 2222, 6000), 
     (3, 2222, 7000), 
     (4, 2222, 10000), 
     (2, 1111, 5000), 
     (3, 1111, 7000), 
     (4, 1111, 8000) 

SELECT t.*, ROUND((t.Cash - oa.Cash) * 1.0/oa.Cash, 2) AS Diff 
FROM @t t 
OUTER APPLY(SELECT TOP 1 * FROM @t 
      WHERE Account = t.Account AND 
        Month_Date < t.Month_Date 
      ORDER BY Month_Date DESC) oa 

Выход:

Month_Date Account Cash Diff 
1   2222 5000 NULL 
2   2222 6000 0.200000000000 
3   2222 7000 0.170000000000 
4   2222 10000 0.430000000000 
2   1111 5000 NULL 
3   1111 7000 0.400000000000 
4   1111 8000 0.140000000000 
Смежные вопросы