2015-05-29 4 views
3

Это то, что я получил в своей таблице базы данных SQL SERVER, где я пытаюсь вычислить остаток отпуска сотрудника. Мои фактические данные:Накопительное добавление в SQL SERVER 2008

EmpId EmpName EvalDate    OpeningEL EnjoyedEL BalanceEL 
12 CHANDRA 2014-04-01 18:30:00.000 0.95  0.00   0.95 
12 CHANDRA 2014-05-01 18:30:00.000 1.30  0.00   1.30 
12 CHANDRA 2014-06-01 18:30:00.000 1.20  1.00   1.20 
12 CHANDRA 2014-07-01 18:30:00.000 1.25  0.00   1.25 
12 CHANDRA 2014-08-01 18:30:00.000 1.25  1.00   1.25 

Но мне нужны данные ниже способом

EmpId EmpName EvalDate    OpeningEL EnjoyedEL BalanceEL 
12 CHANDRA 2014-04-01 18:30:00.000 0.95  0.00   0.95 
12 CHANDRA 2014-05-01 18:30:00.000 2.25  0.00   2.25 
12 CHANDRA 2014-06-01 18:30:00.000 3.45  1.00   2.45 
12 CHANDRA 2014-07-01 18:30:00.000 3.70  0.00   3.70 
12 CHANDRA 2014-08-01 18:30:00.000 4.95  1.00   3.95 

Предыдущие BalanceELs добавляют со следующими OpeningELs.

Итак, как добиться этого .... Пожалуйста, предложите что-нибудь.

+0

нет 'EL с 1.00' в ваших входных данных – ughai

+0

@ughai: Я не получил ты ... можешь плз подробнее рассказать .. – user3657122

+0

В ваших исходных данных, не существует никаких записей с EnjoyedEL как 1. Однако в нашем выпуске есть 2 записи с EnjoyedEL как 1. – ughai

ответ

0

Вы можете использовать CROSS APPLY и GROUP BY для достижения этой

OpeningEL и BalanceEL от CROSS APPLY получите сумму текущих и предыдущих записей для работника.

SELECT 
    EL1.EmpId, 
    EL1.EmpName, 
    EL1.EvalDate, 
    Temp.OpeningEL, 
    EL1.EnjoyedEL, 
    Temp.BalanceEL 
FROM EmployeeLeave EL1 
CROSS APPLY 
(
    SELECT 
    SUM(OpeningEL) as OpeningEL, 
    SUM(BalanceEL) - SUM(EnjoyedEL) as BalanceEL 
    FROM EmployeeLeave EL2 
    WHERE EL2.EmpId = EL1.EmpId 
    AND EL2.EvalDate <= EL1.EvalDate 
)Temp; 
+0

- «EL2.Prev_OpeningEL» этот столбец нет в обеих таблицах – user3657122

+0

thanx много человек, он отлично работает :) – user3657122

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