假设我有一个类似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时差异不会改变的原因。
我试图找出一种建立该领域的好方法。有什么建议吗?
谢谢。
答案 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;
示例数据的结果:
+----------+------------+---------+----------+--------------------+------+-------+
| 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