【问题标题】:SQL moving average with calc of average price per square metre计算每平方米平均价格的 SQL 移动平均线
【发布时间】:2014-07-02 00:21:40
【问题描述】:

我正在尝试获取一组房地产数据的移动平均值,然后我可以使用 MS SQL 2005 绘制图表。

字段为:DateSold datetime、FloorSQM decimal(8,2)、Price decimal(10,0)

我需要做的是,在我们有数据的情况下,每个月内出售的所有房产的每平方米平均价格可以追溯到几年前。

因此,我需要为每个物业定价/楼层面积,然后对每个月应用移动平均线。希望这是有道理的。

我完全被困在试图弄清楚这一点,无休止的谷歌搜索总是令人困惑。

我以为我在另一篇文章中找到了我想要的东西,但是当我尝试编译它时,我不断收到“'m' 附近的语法错误”。

SELECT YEAR(DateSold) AS year, 
   MONTH(DateSold) AS month,
   ROUND(Euros/CONVERT(DECIMAL(10,2),FloorSQM),2) as avg
FROM
(select s.*, DATE_ADD(DTE, INTERVAL m.i MONTH) DateSold, m.i
FROM Property s
cross join (select 0 i union select 1 union select 2 union select 3 union 
         select 4 union select 5 union select 6 union select 7 union 
         select 8 union select 9 union select 10 union select 11) m) sq
WHERE DateSold <= curdate()
GROUP BY YEAR(DateSold), MONTH(DateSold)

当我完成这项工作时,我需要引入 WHERE 子句,以便我可以将找到的属性限制在某些类型(房屋、公寓)和区域(纽约、洛杉矶等)

有人可以帮忙吗?非常感谢您的帮助。

【问题讨论】:

  • SQL Server 2005 在累积值(包括移动平均线)方面并不出色。您是否有能力生成每月结果,然后在您的报告环境中处理这些结果以将其更改为移动平均线?
  • 您是什么意思“对每个月应用移动平均线”?您能否提供示例数据和预期结果。
  • 一个问题是您正在混合来自 MySQL 和 SQL Server 的语法 - DATE_ADD 是 MySQL,DATEADD 是 SQL Server。 CurDate() 是 MySQL,GETDATE() 是 SQL Server。

标签: sql average moving-average


【解决方案1】:

这应该会运行,你使用了一些 Mysql 语法:

SELECT YEAR(DateSold) AS year, 
       MONTH(DateSold) AS month,
       ROUND(Euros/CONVERT(DECIMAL(10,2),FloorSQM),2) as avg
FROM (SELECT s.*, DATEADD(MONTH,m.i,DateSold) DateSold2, m.i
      FROM Property s
      cross join (select 0 i union  select 1 union  select 2 union  select 3 union 
                  select 4 union  select 5 union  select 6 union  select 7 union 
                  select 8 union  select 9 union  select 10 union  select 11
                  ) m        
     )sq
WHERE DateSold<= GETDATE()
GROUP BY YEAR(DateSold), MONTH(DateSold)

不确定它是否返回所需的结果。

更新:我认为DTE 是一个字段名称,你不能在你的子查询中两次引用DateSold,所以我改为DateSold2,不确定你是否打算使用DATEADD() 结果在所有使用DateSold 的地方使用,您也可以从子查询SELECT 列表中删除DateSold。

【讨论】:

  • 您好,感谢您的帮助。但是我收到此错误:“列名 'DTE' 无效。为 'sq' 多次指定了列 'DateSold'。”
  • 这是我发布的 SQL 的基础:stackoverflow.com/questions/9784027/…
  • 哦,我以为DTE 是一个字段名称,它需要是DATEADD(unit_of_time, integer_to_add, date_field) 不确定您要添加哪个日期。您必须将 DATEADD() 结果字段别名为 DateSold 以外的其他字段,因为该字段已经存在。
  • 谢谢。我只是越来越困惑,因为我正在从其他页面获得代码,并且我不知道将您所说的内容应用到代码中以使其工作。所以我想我会把这些值放到一个临时表中,然后应用移动平均线,而不是一次全部完成,这远远超出了我目前的能力。感谢您的帮助!
【解决方案2】:

试试这个:

SELECT YEAR(DateSold) AS year, 
   MONTH(DateSold) AS month,
   AVG(ROUND(Price/CONVERT(DECIMAL(10,2),FloorSQM),2)) as avg
FROM property p
GROUP BY YEAR(DateSold), MONTH(DateSold);

注意,将查询从 Euros 更改为 Price,正如您在架构中指定的那样。

年、月的分组是您获得该月平均价格所需的全部内容。您错过了公式周围的聚合函数 AVG(尽管如果 ROUND 围绕 AVG 可能会更准确)。我在SQLFiddle 设置了一个快速示例。

【讨论】:

    猜你喜欢
    • 2014-12-24
    • 2014-11-18
    • 2021-12-20
    • 2021-05-30
    • 1970-01-01
    相关资源
    最近更新 更多