我的SQL很生锈。我正在使用SQL Server Express 2014。 这是一个有效的查询,可在我的交易表中输出运行余额:
SELECT Id, AccountId, TrxDate, Amount, SUM(Amount)
OVER(PARTITION BY ClientId, AccountId ORDER BY TrxDate, Id) AS Balance
FROM AccountTransaction
WHERE AccountId=1 ORDER BY TrxDate, ID;
这很好地获得了有效的运行余额列。现在,我需要找到一种方法来始终计算整个表的运行余额,但只输出日期范围内的行。如果添加WHERE子句,则OVER()仅应用于过滤后的记录。因此,我需要一种在整个表上执行OVER()的方法,并从这些行中获取一个子集。
在存储过程中,是否可以用游标浏览某些行,但是基于在参数(日期间隔)中发送的条件,仅输出某些行?
还有其他方法吗?
答案 0 :(得分:2)
您可以使用子查询:
SELECT Id, AccountId, TrxDate, Amount,
SUM(Amount) OVER(PARTITION BY ClientId, AccountId ORDER BY TrxDate, Id) AS Balance,
(SELECT COUNT(*) FROM AccountTransaction) AS COUNT_OVERALL
FROM AccountTransaction
WHERE AccountId = 1;
您也可以使用APPLY
:
SELECT Id, AccountId, TrxDate, Amount,
SUM(Amount) OVER(PARTITION BY ClientId, AccountId ORDER BY TrxDate, Id) AS Balance,
ATT.CNT AS COUNT_OVERALL
FROM AccountTransaction AT CROSS APPLY
( SELECT COUNT(*)
FROM AccountTransaction
) ATT(CNT)
WHERE AT.AccountId = 1;