You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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个月",可以改成:
    AND LastTransaction < DATEADD(MONTH, -6, GETDATE())
    
    这种写法会直接计算当前日期往前推6个月的日期,判断交易时间早于这个日期,结果更准确。
  • 分组逻辑: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:10:37