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

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:房产项目主表,核心关联字段id
  • property_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:24:01