SQL Server计算住宿利用率语句报FROM附近错误求助
住宿使用率计算SQL报错修复
原语句问题定位
- 单条SELECT查询写了两个
FROM关键字,是触发FROM位置语法报错的直接原因 - 子查询生成的派生表没有指定别名,不符合SQL Server的强制语法要求
- 子查询内表别名引用错误:给House表定义了别名
B,WHERE条件却用原全名引用STATUS字段,运行时会报字段/对象无效错误 - 存在整数除法陷阱:两个COUNT返回的整型值直接相除会截断小数,比如3间已占用/总共10间会算出0%而不是30%,结果完全失真
- 外层SELECT的字段引用逻辑混乱,没有正确关联总房源量、已占用房源量两个统计值
修正方案
推荐写法:条件聚合(单表扫描,性能最优)
不需要写嵌套子查询,直接通过条件计数一次算出两个值:
SELECT (COUNT(CASE WHEN STATUS = 'Occupied' THEN HouseID END) * 100.0 / COUNT(HouseID)) AS [Accommodation Utilisation %] FROM Accommodation.dbo.House;
逻辑说明:
COUNT(CASE WHEN STATUS = 'Occupied' THEN HouseID END)只会统计状态为已占用的房源ID,非占用状态返回NULL不会被COUNT计入,作为分子;COUNT(HouseID)统计全量房源总数作为分母;乘以100.0是为了将整型运算转为浮点运算,保留小数结果,避免整数除法截断问题。
适配原写法思路的修正版
如果你希望保留子查询统计已占用数量的写法,可以用交叉关联拼接两个统计值:
SELECT (B.OccupiedCnt * 100.0 / COUNT(A.HouseID)) AS [Accommodation Utilisation %] FROM Accommodation.dbo.House A CROSS JOIN ( SELECT COUNT(HouseID) AS OccupiedCnt FROM Accommodation.dbo.House WHERE STATUS = 'Occupied' ) B GROUP BY B.OccupiedCnt;
内容的提问来源于stack exchange,提问作者C Awaibe
相关产品推荐
相关产品推荐

