如何在SQL Server 2014中按状态统计符合条件的账户数量及余额总和?
看起来你已经有了一个不错的开头,我来帮你补全并优化这个查询,确保它能精准满足你的需求:
完整的SQL查询语句
SELECT COUNT(AccountNumber) AS NoOfAccts, SUM(CurrentBalance) AS TotalBalance, StatusId FROM Accounts WHERE StatusId IN (1, 2, 11) -- 限定只统计目标状态的账户 AND DATEDIFF(DAY, LastTransaction, GETDATE()) > 180 -- 筛选交易超过6个月的账户 GROUP BY StatusId; -- 按状态分组统计
关键细节解释
- WHERE子句补充:你原来的查询没有限定
StatusId的范围,这样会把所有状态符合交易时间条件的账户都统计进来,加上StatusId IN (1,2,11)才能精准锁定你需要的三个状态。 - 时间筛选的优化建议:用
DATEDIFF(DAY, ...)判断6个月其实是近似值(毕竟不同月份天数不同),如果想要更精确的"超过6个月",可以改成:
这种写法会直接计算当前日期往前推6个月的日期,判断交易时间早于这个日期,结果更准确。AND LastTransaction < DATEADD(MONTH, -6, GETDATE()) - 分组逻辑:
GROUP BY StatusId会让查询按每个状态单独统计数量和余额总和,最终结果里每个状态对应一行数据。
扩展:强制显示所有目标状态(即使无符合条件账户)
如果某个状态下没有满足条件的账户,上面的查询不会返回该状态的行。如果想要强制显示1、2、11三个状态,哪怕数量为0,可以用临时表或VALUES子句做左连接:
WITH TargetStatuses AS ( SELECT 1 AS StatusId UNION ALL SELECT 2 UNION ALL SELECT 11 ) SELECT COUNT(a.AccountNumber) AS NoOfAccts, ISNULL(SUM(a.CurrentBalance), 0) AS TotalBalance, ts.StatusId FROM TargetStatuses ts LEFT JOIN Accounts a ON ts.StatusId = a.StatusId AND DATEDIFF(DAY, a.LastTransaction, GETDATE()) > 180 GROUP BY ts.StatusId;
这里用ISNULL把空的余额总和转为0,让结果更规整。
内容的提问来源于stack exchange,提问作者user1777929
相关产品推荐
相关产品推荐

