问题描述
我想从2个表中获取数据,并按日期对它们进行排序: 获取客户的累计余额
我要从中获取数据的2个表是我的表:转账和转帐付款
转移:
ID int
cust_id int
tfrom nvarchar(200)
tto nvarchar(200)
price decimal(18,2)
tax decimal(18,2)
final Calculated
tnumber nvarchar(30)
note nvarchar(MAX)
date date
交易付款:
ID int
cust_id int
value decimal(18,2)
method nvarchar(30)
note nvarchar(MAX)
date date
假设我有此数据:
转移:
ID cust_id final date
1 5 3000 22-09-2020
2 5 1500 25-09-2020
3 10 4000 28-09-2020
交易付款:
ID cust_id value date
1 5 1000 22-09-2020
2 5 1500 23-09-2020
3 5 1000 01-10-2020
4 10 1000 28-09-2020
5 10 2000 01-10-2020
客户5:
cust_id final value Balance date
5 3000 0 3000 22-09-2020 --- > Purchases
5 0 1000 2000 22-09-2020 --- > payment
5 0 1500 500 23-09-2020 --- > payment
5 1500 0 2000 25-09-2020 --- > P
5 0 1000 1000 23-09-2020 --- > payment purchases
最后一行是客户的最终余额
我尝试过:
CREATE VIEW customer_account_summary as
WITH Tb0 as
( SELECT ID,date,cust_id,final,0'value' from transfers
UNION
SELECT ID,0'final',value from trans_payments
),Tb1 as
(
SELECT ID,value,Row_Number() over (order by date asc) as [OrderId]
FROM
Tb0
)
SELECT TOP 1000000 T1.ID,T1.cust_id,T1.date,T1.final,T1.value,(Sum(T2.final) - Sum(T2.value)) as Balance FROM Tb1 as T1
INNER JOIN
Tb1 as T2
ON T1.[OrderId] <= T2.[OrderId]
Group By T1.ID,T1.value
Order by [date]
但是我有一个问题,如果2个客户在同一日期付款,那么付款将为2个在同一日期付款的客户计算,我试图添加2个客户的ID以防止查询对数据进行分组,但是我我仍然面临着天平上的错误。
我该如何以正确的方式做到这一点?
解决方法
我认为这是union all
和一个窗口sum()
:
select cust_id,final,value,date,sum(balance) over(partition by cust_id order by date,seq) balance
from (
select cust_id,final balance,0 from transfers
union all
select cust_id,-value,1 from trans_payments
) t (cust_id,balance,seq)
order by cust_id,seq
当两个表中都存在给定日期的行时,这会将转账放在首位。
cust_id | final | value | date | balance ------: | ----: | ----: | :--------- | ------: 5 | 3000 | 0 | 2020-09-22 | 3000 5 | 0 | 1000 | 2020-09-22 | 2000 5 | 0 | 1500 | 2020-09-23 | 500 5 | 1500 | 0 | 2020-09-25 | 2000 5 | 0 | 1000 | 2020-10-01 | 1000 10 | 0 | 2000 | 2020-01-01 | -2000 10 | 4000 | 0 | 2020-09-28 | 2000 10 | 0 | 1000 | 2020-09-28 | 1000
您可以使用where
子句来过滤给定的客户。