我必须从SQL表中进行每日报告,其中包含ID(用户ID),时间戳,余额交易。
我的任务:每个交易都存储在表格中。我必须每天都知道所有用户的总结。
例如:
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$
在这种情况下,结果必须如下:
27/06/2016:85 $(75 + 10),因为上次用户1的余额为75,用户数为10
28/06/2016:72 $(22 + 10 + 40),因为上一个用户1的余额22和用户2 10(它在昨天被修改但我必须计算!!!)和user3 22 $
请帮忙。
由于
我的解决方案,但它不正确:仅在当天的交易中提供结果,并且不会添加前一天的结果。
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))
)
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
答案 0 :(得分:1)
我不确定解决方案中涉及的其他表格。只是根据给出的查询为您提供通用解决方案:
---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,这是最新的余额。