SQL Server 开窗函数Over的使用(计算结存金额)

本文介绍了如何在SQL Server中利用开窗函数Over来计算每个币种在每个交易日的结存金额,通过示例展示了其简单易用的特点,并提到结合Top关键字可用于更多数据分析场景。

SQL Server 开窗函数Over的使用(计算结存金额)

假设我们有一组数据,包含四列(币种,交易日期,收入金额,支出金额)

Select * From
(Values
('CNY','2022-01-01',100,50),
('CNY','2022-01-02',200,50),
('CNY','2022-01-03',300,100),
('CNY','2022-01-04',400,50),
('CNY','2022-01-05',500,60),
('CNY','2022-01-06',1000,500),
('CNY','2022-01-07',600,300),
('CNY','2022-01-08',800,400),
('CNY','2022-01-09',100,50),
('CNY','2022-01-10',0,500),
('USD','2022-01-01',100,50),
('USD','2022-01-02',200,50),
('USD','2022-01-03',300,100),
('USD','2022-01-04',400,500),
('USD','2022-01-05',500,60),
('USD','2022-01-06',400,500),
('USD','2022-01-07',600,300),
('USD','2022-01-08',800,400),
('USD','2022-01-09',100,50),
('USD','2022-01-10',10,500)
) 
TempTable(Currency,TradeDate,InValue,OutValue)

数据内容如下图

在这里插入图片描述
我们如何计算每个币种在每个交易日的结存金额呢?在不使用Over开窗函数的情况下,我们需要编写一个计算余额的函数GetBalance(@Currency char(3),TradeDate Date)来每日实现余额的计算,这里我们就不继续写函数的具体实现了。下面我们看看如何使用Over开窗函数实现余额计算功能。

Select Currency,TradeDate,InValue,OutValue
,Sum(InValue-OutValue) Over(Partition By Currency Order By TradeDate ASC Rows Unbounded Preceding) BalanceValue
From
(Values
('CNY','2022-01-01',100,50),
('CNY','2022-01-02',200,50),
('CNY','2022-01-03',300,100),
('CNY','2022-01-04',400,50),
('CNY','2022-01-05',500,60),
('CNY','2022-01-06',1000,500),
('CNY','2022-01-07',600,300),
('CNY','2022-01-08',800,400),
('CNY','2022-01-09',100,50),
('CNY','2022-01-10',0,500),
('USD','2022-01-01',100,50),
('USD','2022-01-02',200,50),
('USD','2022-01-03',300,100),
('USD','2022-01-04',400,500),
('USD','2022-01-05',500,60),
('USD','2022-01-06',400,500),
('USD','2022-01-07',600,300),
('USD','2022-01-08',800,400),
('USD','2022-01-09',100,50),
('USD','2022-01-10',10,500)
) 
TempTable(Currency,TradeDate,InValue,OutValue)
Order  By Currency,TradeDate

我们来看一下执行结果
在这里插入图片描述
是不是很简单,只是增加了一个计算列。

Sum(InValue-OutValue) Over(Partition By Currency Order By TradeDate Rows Unbounded Preceding) BalanceValue

我们使用Over开窗函数和结合Top关键字可以方便的获得累计销售额、销售额排名前几位的销售商品等等分析数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值