【问题标题】:Make balance report with previous与以前的余额报告
【发布时间】:2017-07-10 20:11:22
【问题描述】:

我必须从包含 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$

在这种情况下,结果必须如下:

27/06/2016: 85$ (75+10) 因为最后一个用户 1 的余额 75 和用户 2 10

28/06/2016: 72$ (22+10+40) 因为最后一个 user1 的余额 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

【问题讨论】:

  • 如果在 2016 年 6 月 29 日用户 2 的交易再次没有出现怎么办? 2016/06/29/29/06/2016 27/06/2016 的交易是否需要统计 User2?
  • 只有最后一次更新需要(因为这是每个账户的状态)是的
  • 例如,如果 29 日没有交易,那么我必须得到与前一天相同的结果。或者如果一个新帐户仅在 29 日修改,我必须将这些余额添加到 28 日余额。

标签: sql sql-server


【解决方案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,这就是最新的余额。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2020-08-12
    相关资源
    最近更新 更多