使用SELECT COUNT DISTINCT统计关联父账户的子账户数量异常排查
问题修复:统计父账户对应的子账户数量
你的SQL存在两个关键问题,导致统计结果和实际数据不符:
- 分组字段错误:表中存储账户名称的字段是
AccountName,但你写了GROUP BY Name,字段名不匹配,要么触发语法错误,要么导致分组逻辑完全错误。 - 统计逻辑错误:
COUNT(DISTINCT ParentNum)是统计不同父账户编号的数量,而我们需要的是每个父账户下的子账户总数,应该统计每个ParentNum对应的子账户记录数,不需要对父编号去重。
正确的SQL写法
写法一:自连接关联父账户
通过自连接将父账户与子账户关联,直接统计每个父账户的子账户数量:
SELECT parent.AccountName, COUNT(child.AccountName) AS ChildCount FROM Accounts parent LEFT JOIN Accounts child ON parent.AccountNum = child.ParentNum WHERE parent.ParentNum IS NULL -- 仅筛选父账户(ParentNum为NULL的是父账户) GROUP BY parent.AccountName ORDER BY ChildCount DESC;
写法二:先统计子账户数再关联父账户
先从子账户数据中按父编号分组统计数量,再关联父账户表获取对应的账户名称:
SELECT parent.AccountName, child_stats.ChildCount FROM Accounts parent JOIN ( SELECT ParentNum, COUNT(*) AS ChildCount FROM Accounts WHERE ParentNum IS NOT NULL GROUP BY ParentNum ) child_stats ON parent.AccountNum = child_stats.ParentNum WHERE parent.ParentNum IS NULL ORDER BY ChildCount DESC;
预期输出结果
根据你提供的表数据,执行正确SQL后会得到符合实际的统计结果:
| AccountName | ChildCount |
|---|---|
| Alpha | 3 |
| Gamma | 1 |
| Zeta | 1 |
| Beta | 0 |
内容的提问来源于stack exchange,提问作者David Aerne
相关产品推荐
相关产品推荐

