减少客户总行数

时间:2018-08-27 16:07:35

标签: sql sql-server sql-server-2012 sum

假设我有一个类似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 :(得分:1)

假设您使用的是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;

Angular API

示例数据的结果:

+----------+------------+---------+----------+--------------------+------+-------+
| 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 |
+----------+------------+---------+----------+--------------------+------+-------+

答案 1 :(得分:0)

我只求和:

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;

答案 2 :(得分:0)

您可以通过联接汇总表并根据日期进行有条件的总和来实现。下面的代码应该可以满足您的需求。

Service