sql - MsSQL 贷记、借记和余额
问题描述
我有一张如下表。
Name| Date | Debit | Credit
-------------------------------------------
A | 02.02.2020 | 10,00 | 0,00
A | 03.02.2020 | 20,00 | 0,00
A | 04.02.2020 | 0,00 | 30,00
A | 05.02.2020 | 20,00 | 0,00
A | 06.02.2020 | 40,00 | 0,00
A | 07.02.2020 | 50,00 | 0,00
A | 08.02.2020 | 15,00 | 0,00
A | 09.02.2020 | 20,00 | 0,00
A | 10.02.2020 | 10,00 | 0,00
A | 11.02.2020 | 20,00 | 0,00
A | 12.02.2020 | 0,00 | 50,00
A | 13.02.2020 | 0,00 | 60,00
A | 14.02.2020 | 20,00 | 15,00
B | 20.01.2020 | 10,00 | 0,00
B | 21.01.2020 | 20,00 | 0,00
B | 22.01.2020 | 40,00 | 0,00
B | 23.01.2020 | 0,00 | 100,00
B | 24.01.2020 | 20,00 | 0,00
B | 25.01.2020 | 10,00 | 0,00
B | 26.01.2020 | 0,00 | 10,00
B | 27.01.2020 | 10,00 | 0,00
我想用这个表创建一个“视图”。首先,所有“学分”将根据“名称”相互添加。然后,从总“贷方”中减去“借方”。此处获得的值将在第一个日期写入“余额”列。然后从这里,“借方”列上的值将按顺序减去并写入今天日期的“余额”列。
我想要获得的“视图”如下图所示。
Name| Date | Debit | Credit | Balance | Credit Total
-------------------------------------------------------------------------
A | 02.02.2020 | 10,00 | 0,00 | 145,00 | 155,00
A | 03.02.2020 | 20,00 | 0,00 | 125,00 |
A | 04.02.2020 | 0,00 | 30,00 | 125,00 |
A | 05.02.2020 | 20,00 | 0,00 | 105,00 |
A | 06.02.2020 | 40,00 | 0,00 | 65,00 |
A | 07.02.2020 | 50,00 | 0,00 | 15,00 |
A | 08.02.2020 | 15,00 | 0,00 | 0,00 |
A | 09.02.2020 | 20,00 | 0,00 | -20,00 |
A | 10.02.2020 | 10,00 | 0,00 | -30,00 |
A | 11.02.2020 | 20,00 | 0,00 | -50,00 |
A | 12.02.2020 | 0,00 | 50,00 | -50,00 |
A | 13.02.2020 | 0,00 | 60,00 | -50,00 |
A | 14.02.2020 | 20,00 | 15,00 | -70,00 |
B | 20.01.2020 | 10,00 | 0,00 | 100,00 | 110,00
B | 21.01.2020 | 20,00 | 0,00 | 80,00 |
B | 22.01.2020 | 40,00 | 0,00 | 40,00 |
B | 23.01.2020 | 0,00 | 100,00 | 40,00 |
B | 24.01.2020 | 20,00 | 0,00 | 20,00 |
B | 25.01.2020 | 10,00 | 0,00 | 10,00 |
B | 26.01.2020 | 0,00 | 10,00 | 10,00 |
B | 27.01.2020 | 10,00 | 0,00 | 0,00 |
我可以在“mvc”中执行此操作,如下所示:
var creditTotal = Model.Sum(x => x.Credit);
foreach (var item in Model.OrderBy(x => x.Date))
{
<tr>
<td>@item.Name</td>
<td>@item.Date</td>
<td>@item.Debit</td>
<td>@item.Credit</td>
<td>@creditTotal - item.Debit</td>
</tr>
creditTotal = creditTotal - item.Debit;
}
但如果我能在 SQL View 中做到这一点会好得多。有没有办法在sql视图中做到这一点?
解决方案
您可以使用窗口函数:
select t.*,
(sum(credit) over (partition by name) -
sum(debit) over (partition by name order by date)
) as balance,
(case when row_number() over (partition by name order by date) = 1
then sum(credit) over (partition by name)
end) as credit_total
from t
推荐阅读
- r - 在数字数据帧中添加字符串并连接两个字符串数据帧
- javascript - 将 Kendo Grid 工具栏搜索应用于日期的模板值
- python - 如何在多处理时使用用户输入
- c# - C# 没有隐式转换为继承的类型
- firefox - 由于代理配置而导致的硒线阻塞连接
- java - 如何在 Internet 恢复或重新创建 Activity 时恢复下载
- python - 居中和添加 numpy 数组
- php - GuzzleHttp\Exception\RequestException cURL 错误 3:(参见 https://curl.haxx.se/libcurl/c/libcurl-errors.html)在安装 laravel 6 时
- amazon-web-services - 我的前端和后端未连接到 AWS 云(出现 405 错误)
- python - 如何重写字典中的字典键?