MySQL使用聚合函数计算地块及房产项目的已售面积占比
结论
不能直接对各地块的已售占比求平均值得到项目整体占比。
原因:各地块的面积基数不同,直接求算数平均会忽略面积权重,计算结果和真实的项目整体销售占比存在明显偏差。举个简单的验证例子:
假设3个地块面积分别为100㎡、300㎡、200㎡,对应已售占比分别为100%、66.67%、50%:
- 直接求平均占比:
(100%+66.67%+50%)/3 ≈ 72.22%- 真实整体占比:总已售面积
(100*100% + 300*66.67% + 200*50%) = 400㎡,总项目面积100+300+200=600㎡,真实占比400/600 ≈ 66.67%,两者差距明显。
正确实现方案
涉及的三张表核心字段梳理:
properties:房产项目主表,核心关联字段idproperty_plots:地块表,核心字段id(地块ID)、property_id(关联项目ID)、no_sqyds(地块总面积)orders:订单表,核心字段plot_id(关联地块ID)、no_sqyds(购买的地块面积)
1. 单个地块的已售面积占比查询
原有逻辑正确,可优化为关联写法,同时处理无订单地块的空值、除零异常:
SELECT pp.id AS plot_id, pp.property_id, pp.no_sqyds AS plot_total_area, COALESCE(SUM(o.no_sqyds), 0) AS plot_sold_area, -- 处理地块面积为0的异常情况,避免除零报错 CASE WHEN pp.no_sqyds = 0 THEN 0 ELSE ROUND((COALESCE(SUM(o.no_sqyds), 0) * 100.0) / pp.no_sqyds, 2) END AS sold_percentage FROM property_plots pp LEFT JOIN orders o ON pp.id = o.plot_id GROUP BY pp.id, pp.property_id, pp.no_sqyds;
2. 房产项目维度的整体已售面积占比查询
逻辑为项目总已售面积 / 项目所有地块总建筑面积 * 100%:
SELECT p.id AS property_id, p.property_name, -- 可根据properties表的实际字段调整 SUM(pp.no_sqyds) AS property_total_area, COALESCE(SUM(o.no_sqyds), 0) AS property_sold_area, -- 处理项目总面积为0的异常 CASE WHEN SUM(pp.no_sqyds) = 0 THEN 0 ELSE ROUND((COALESCE(SUM(o.no_sqyds), 0) * 100.0) / SUM(pp.no_sqyds), 2) END AS property_sold_percentage FROM properties p LEFT JOIN property_plots pp ON p.id = pp.property_id LEFT JOIN orders o ON pp.id = o.plot_id GROUP BY p.id, p.property_name;
如果只需要查询单个项目的占比,在末尾添加WHERE p.id = 目标项目ID即可。
内容的提问来源于stack exchange,提问作者abhiburk
相关产品推荐
相关产品推荐

