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

如何按不同经理ID统计管理建筑数量?SQL语法求助

问题修正:统计低薪资经理管理的建筑数量

原SQL存在的问题

  1. GROUP BY语法不符合标准规范:SELECT子句中包含MFName, MLName, MSalary, MBDate这些非聚合字段,但仅将ManagerID放入GROUP BY,在多数严格模式的数据库(如PostgreSQL、SQL Server、Oracle)中会直接报错,因为数据库无法确定这些字段对应分组内的哪一行值。
  2. 隐式JOIN可读性差:用逗号连接两张表的写法属于旧语法,显式JOIN更清晰,便于维护。
  3. 遗漏无建筑的经理:原SQL用INNER JOIN会过滤掉那些薪资低于55000但未管理任何建筑的经理(如果存在的话)。

修正方案一:标准兼容的INNER JOIN写法

适合只需要统计有管理建筑的经理,兼容所有数据库:

-- 5.2.10 显示所有薪资低于55000美元的经理的MFName、MLName、MSalary、MBdate以及他们管理的建筑数量
SELECT 
    m.MFName, 
    m.MLName, 
    m.MSalary, 
    m.MBDate,     
    COUNT(b.BuildingID) AS NoOfBuildManaged    
FROM Manager m
INNER JOIN Building b 
    ON m.ManagerID = b.BManagerID    
WHERE m.MSalary < 55000    
GROUP BY m.ManagerID, m.MFName, m.MLName, m.MSalary, m.MBDate;

如果ManagerID是Manager表的主键,部分数据库(如Oracle、PostgreSQL 10+)允许简化GROUP BY为GROUP BY m.ManagerID,但全字段GROUP BY的写法兼容性最好。


修正方案二:包含无建筑经理的LEFT JOIN写法

如果需要展示所有薪资低于55000的经理(包括未管理任何建筑的),用子查询统计建筑数后关联:

-- 5.2.10 显示所有薪资低于55000美元的经理的MFName、MLName、MSalary、MBdate以及他们管理的建筑数量
SELECT 
    m.MFName, 
    m.MLName, 
    m.MSalary, 
    m.MBDate,     
    COALESCE(b_count.NoOfBuildManaged, 0) AS NoOfBuildManaged
FROM Manager m
LEFT JOIN (
    SELECT 
        BManagerID, 
        COUNT(BuildingID) AS NoOfBuildManaged
    FROM Building
    GROUP BY BManagerID
) b_count 
    ON m.ManagerID = b_count.BManagerID
WHERE m.MSalary < 55000;

COALESCE函数用于将NULL(无建筑时的统计值)转换为0,结果更直观。

内容的提问来源于stack exchange,提问作者LordKale179

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:10:09