如何按不同经理ID统计管理建筑数量?SQL语法求助
问题修正:统计低薪资经理管理的建筑数量
原SQL存在的问题
- GROUP BY语法不符合标准规范:SELECT子句中包含
MFName, MLName, MSalary, MBDate这些非聚合字段,但仅将ManagerID放入GROUP BY,在多数严格模式的数据库(如PostgreSQL、SQL Server、Oracle)中会直接报错,因为数据库无法确定这些字段对应分组内的哪一行值。 - 隐式JOIN可读性差:用逗号连接两张表的写法属于旧语法,显式
JOIN更清晰,便于维护。 - 遗漏无建筑的经理:原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
相关产品推荐
相关产品推荐

