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

SQL Server双表查询需求:获取指定条件的所有账户及余额(含无交易记录账户)

SQL Server双表查询需求:获取指定条件的所有账户及余额(含无交易记录账户)

我来帮你搞定这个查询问题~你当前代码的核心问题是WHERE子句里的T.Post = 1把没有交易记录的账户给过滤掉了。因为用LEFT JOIN的时候,没有匹配交易记录的账户,Transaction表的所有字段都会是NULL,而NULL和1做相等判断是不成立的,所以这些账户就被排除了。

问题分析

你的原始SQL里,WHERE A.AccSubCode = 3 AND T.Post = 1这行,相当于把LEFT JOIN变成了INNER JOIN——只有同时满足AccSubCode=3且存在Post=1的交易记录的账户才会被保留,这就不符合你要显示所有AccSubCode=3账户的需求。

修正后的SQL代码

把T.Post = 1的条件从WHERE子句移到LEFT JOIN的ON子句里,这样就能只关联符合Post=1的交易记录,同时保留所有AccSubCode=3的账户:

SELECT
    A.AccName,
    A.AccID,
    ISNULL(SUM(T.Debt), 0) - ISNULL(SUM(T.Credit), 0) AS [Balance]
FROM Accounts AS A
LEFT JOIN [Transaction] AS T
    ON A.AccID = T.AccID
    AND T.Post = 1  -- 把Post条件放在JOIN关联规则里,而非WHERE过滤
WHERE A.AccSubCode = 3
GROUP BY A.AccID, A.AccName

代码说明

  1. 条件位置调整:将T.Post = 1放到ON子句,确保左连接时只匹配符合条件的交易,没有匹配的账户依然会被保留,只是Transaction相关字段为NULL。
  2. NULL值处理:用ISNULL(SUM(T.Debt), 0)和ISNULL(SUM(T.Credit), 0),保证当账户没有符合条件的交易时,SUM的结果(NULL)会被转换成0,最终余额计算为0-0=0。
  3. 简化AccID获取:因为已经按A.AccID分组,直接使用A.AccID即可,不需要用Max(ISNULL(A.AccID, 0)),多余且没必要。

执行这段SQL后,就能得到你想要的结果:

AccNameAccIDBalance
Account11500
Account220

备注:内容来源于stack exchange,提问作者Ahmed Saif

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 09:35:29