首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用以前的报告做余额报告

用以前的报告做余额报告
EN

Stack Overflow用户
提问于 2017-07-10 11:04:32
回答 1查看 133关注 0票数 1

我必须每天从包含ID (用户id)、时间戳、平衡事务的SQL表中进行报告。

我的任务是:所有事务都存储在表中。我必须知道总结所有用户的平衡在每一天。

例如:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-10 12:11:22

我不知道该解决方案涉及哪些其他表格。只需根据给定的查询为您提供一个通用解决方案:

代码语言:javascript
复制
---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,这是最新的余额。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45010387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档