Уменьшить сумму по рядам клиентов - PullRequest
0 голосов
/ 27 августа 2018

Давайте предположим, что у меня есть данные типа (diff - желаемый вывод), и мне нужно построить столбец diff:

customer      mis_date  sal_Ind sal_amnt Exp_Salary_Monthly diff
    10001     2018-01-01   0      4000    8000            8000
    10001     2018-01-02   1      1000    8000            7000
    10001     2018-01-03   0      9000    8000            7000
    10001     2018-01-04   0      500     8000            7000
    10001     2018-01-05   1      1500    8000            5500

Объяснение:

Клиент имеет месячную зарплату, но переводит ее не за один раз Мне нужно видеть как баланс (столбец различий) суммы зарплаты, которую нужно внести, чтобы получить сумму поля exp_salary, которая является максимальной суммой (разница не может быть отрицательной). Как я могу узнать, что транзакция является зарплатой? Sal_Ind является ответом, и поэтому разница не меняется, когда sal_ind = 0.

Я пытаюсь найти хороший и хороший способ построить это поле. Есть предложения?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Я бы просто сделал накопительную сумму:

select t.*, 
       Exp_Salary_Monthly - sum(case when sal_ind = 1 then sal_amnt else 0 end) over (partition by customer order by mis_date) as diff
from table t;
0 голосов
/ 27 августа 2018

Это можно сделать, присоединившись к агрегированной таблице и составив условную сумму на основе дат. Код ниже должен делать то, что вам нужно.

    Create table #Data
            (
            Customer Varchar(50),
            mis_date datetime,
            sal_Ind int,
            sal_amnt float,
            exp_Salary float
                    )

        Insert INTO #Data Values

        ('10001','2018-01-01','0','4000','8000'),
        ('10001','2018-01-02','1','1000','8000'),
        ('10001','2018-01-03','0','9000','8000'),
        ('10001','2018-01-04','0','500','8000'),
        ('10001','2018-01-05','1','1500','8000')




        Select
        D.Customer,D.mis_date,D.sal_Ind,D.exp_Salary
        ,D.exp_Salary - Sum(Case when d2.mis_date <= D.mis_date and D2.sal_Ind = 1 then D2.sal_amnt else 0 end) as DiffCalc
        From #Data D
        inner join #Data D2 on D.Customer = D2.Customer
        group by D.Customer,D.mis_date,D.sal_Ind,D.exp_Salary
0 голосов
/ 27 августа 2018

Предполагая, что вы SQL Server 2012 или новее (я не думаю, что 2008 поддержит это). Вы можете использовать магию Windows Functions, чтобы получить общее количество sal_amnt, где sal_ind = 1, а затем просто вычесть это из вашего exp_salary_monthly:

SELECT mytable.*,
  exp_salary_monthly - SUM(CASE WHEN sal_ind = 1 THEN sal_amnt ELSE 0 END) OVER (PARTITION BY customer ORDER BY mis_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as diff1
FROM mytable;

SQLFiddle этого в действии

Результаты ваших выборочных данных:

+----------+------------+---------+----------+--------------------+------+-------+
| customer |  mis_date  | sal_Ind | sal_amnt | Exp_Salary_Monthly | diff | diff1 |
+----------+------------+---------+----------+--------------------+------+-------+
|    10001 | 2018-01-01 | false   |     4000 |               8000 | 8000 |  8000 |
|    10001 | 2018-01-02 | true    |     1000 |               8000 | 7000 |  7000 |
|    10001 | 2018-01-03 | false   |     9000 |               8000 | 7000 |  7000 |
|    10001 | 2018-01-04 | false   |      500 |               8000 | 7000 |  7000 |
|    10001 | 2018-01-05 | true    |     1500 |               8000 | 5500 |  5500 |
+----------+------------+---------+----------+--------------------+------+-------+
...