【问题标题】:SQL - calculate forecast averageSQL - 计算预测平均值
【发布时间】:2016-02-01 17:26:40
【问题描述】:

我正在尝试根据前 3 个月的销售预测来计算销售预测,该预测可以是实际的也可以是预测的。

company_id    Year    Month    Actuals    Forecast 
  123456      2014      1         10     
  123456      2014      2         15     
  123456      2014      3         17     
  123456      2014      4                 14.00
  123456      2014      5                 15.33 
  123456      2014      6                 15.44
  123456      2014      7                 14.93

Month 4 = (10+15+17)/3
Month 5 = (15+17+14)/3
Month 6 = (17+14+15.33)/3
Month 7 = (14+15.33+15.44)/3

假设我想为每个公司计算未来 18 个月的预测。

我正在查看去年的数据。一些公司有例如2个月的数据和其他12个月的数据等等。

我已经搜索并找到了许多不同的解决方案,但它们都只考虑了实际情况。

我想我必须做一个递归 CTE,但我想不通。

请帮忙:)

【问题讨论】:

  • 您所有月份的顺序是否与您的示例中完全相同?即,如果 n = 任何给定月份,一个月的计算是否只是 (n-1) + (n-2) + (n-3) / 3 的实际/预测值?
  • 你的 DBMS 是什么?是否支持Windowed AggregatesMIN... OVER (ORDER BY ...)
  • @EatPeanutButter - 是的,也不是。月份是 01-01-2015 等日期。我刚刚展示了他们的 row_number(如果有意义的话)。
  • @dnoeth - 我正在使用 SSMS 2008 R2。是的,它支持 OVER(ORDER BY) 等
  • 看起来你可以添加实际和预测来获得你的工作号码,因为它总是填充一个或另一个。

标签: sql sql-server-2008-r2 average common-table-expression recursive-query


【解决方案1】:

所以你想要基于先前移动平均线的移动平均线 :) 我认为,在 SQL Server 上编程时,总是必须意识到哪些任务更适合基于集合的方法,哪些更通用的逐行方法。如果您问我,您的任务非常适合简单的逐行处理。这是一个例子

declare @temp table ([Month] int, Actual decimal(29, 2), Forecast decimal(29, 2))
declare @month int

insert into @temp (
    [Month], Actual
)
select 1, 10 union all
select 2, 15 union all
select 3, 17

select @month = isnull(max([Month]) + 1, 1) from @temp

while @month <= 18
begin
    insert into @temp (
        [Month], Forecast
    )
    select
        @month, avg(a.value) as Forecast
    from (
        select top 3 isnull(Actual, Forecast) as value
        from @temp
        order by [Month] desc
    ) as a

    select @month = @month + 1
end

select * from @temp

【讨论】:

  • 太棒了!我越来越近了。我试图调整代码以便我可以使用它,但我需要更多帮助。我将编辑我的问题...我认为解决方案就在附近。
  • 所以您想计算每个公司的某个月或仅 18 个月?假设一家公司拥有 2014-03 年的最新数据,而另一家公司拥有 2013-12 年的最新数据,结果应该是什么?
  • 假设我们从 2014-01 开始。如果我只得到 2014-03 年的数据,而今年剩下的时间没有更多数据,那么 2015-01 = (11*0 + 10*1) / 12 = 0,83。 2015-02=(10*0 + 10*1 + 0.833*1) / 12 = 0,90。这有意义吗?
  • 我的意思是 - 您是否希望所有公司的最后一个月的结果都相同?还是应该根据表中的实际数据为每家公司预测 18 个月?
  • 啊,好吧。预测应该针对每家公司。我做了一个游标来循环每个公司。现在我只需要正确计算平均值...
猜你喜欢
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
相关资源
最近更新 更多