我必须每天从包含ID (用户id)、时间戳、平衡事务的SQL表中进行报告。
我的任务是:所有事务都存储在表中。我必须知道总结所有用户的平衡在每一天。
例如:
27/06/2016 8:10 User1 50$
27/06/2016 10:22 User1 75$
27/06/2016 11:32 User2 10$
28/06/2016 09:22 User3 40$
28/06/2016 17:35 User1 22$在这种情况下,结果必须如下:
2016年6月27日:85美元(75+10),因为最后一个用户的余额是75和user2 10。
2016年6月28日:72美元(22+10+40),因为上一次用户1的余额22和user2 10 (昨天修改了,但我不得不计算!)和user3 22美元
请帮帮忙。
谢谢
我的解决方案,但它是不正确的:只提供结果,如果事务是在当天,而不添加前一天的结果。
以下是我迄今尝试过的请求:
请求1:
USE DB1;
GO
WITH cte (bin, currency, id, currentbalance, currentledgerbalance, dt) as ( SELECT bin, w.currency, w.id,t.currentbalance, t.currentledgerbalance, t.dt
FROM [DB1].[Tb1] b
inner join [tb2] c
on b.[id]=c.[id]
inner join tb3 w
on c.id=w.id and w.currency=b.currency
inner join [DB1].[tb4] t
on t.walletid=w.id )
, CTE2 (bin,currency,id,currentbalance,currentledgerbalance,dt) as (
select *
from cte
where dt in (select MAX(dt) FROM cte GROUP BY currency,id,DAY(dt), MONTH(dt), YEAR(dt))
)请求2:
select currency
,cast(dt as date) as stat_day
,sum(currentbalance) as currentbalance
from CTE2
GROUP BY currency,cast(dt as date)
order by stat_day go发布于 2017-07-10 12:11:22
我不知道该解决方案涉及哪些其他表格。只需根据给定的查询为您提供一个通用解决方案:
---Creating a test table
create table usertrans (tid int identity, tdate date, uname varchar(30),balance int);
insert into usertrans values ('06/27/2017','user1',50);
insert into usertrans values ('06/27/2017','user1',75);
insert into usertrans values ('06/27/2017','user2',10);
insert into usertrans values ('06/28/2017','user3',40);
insert into usertrans values ('06/28/2017','user1',22);
select * from usertrans
-- Retrieving (2017-06-28) balance
with UMaxTrans(UName,TID)
AS(
select uname, max(tid) AS TID from usertrans
WHERE TDate < = '2017-06-28'
group by uname)
select CAST(GETDATE() AS DATE) AS 'Today' , sum(Balance) FROM UserTrans UT
INNER JOIN UMaxTrans UMT ON UT.TID = UMT.TID;
-- Retrieving (2017-06-27) balance
with UMaxTrans(UName,TID)
AS(
select uname, max(tid) AS TID from usertrans
WHERE TDate < = '2017-06-27'
group by uname)
select CAST(GETDATE() AS DATE) AS 'Today' , sum(Balance) FROM UserTrans UT
INNER JOIN UMaxTrans UMT ON UT.TID = UMT.TID;逻辑:我们有用户,在给定的一天中,余额可能会更改多少次,但是在计算来自所有用户的总余额时,我们必须考虑用户的最新事务。这就是我们在查询中要做的。我们正在获取给定用户的最大事务ID,这是最新的余额。
https://stackoverflow.com/questions/45010387
复制相似问题