【问题标题】:Calculated Weighted Average in SQLSQL 中的计算加权平均值
【发布时间】:2017-05-22 21:33:05
【问题描述】:

我正在尝试计算每个月的 YTD 值。我如何在 SQL Server 中实现这一点?

绿色是我的数据在表格中的样子。我想用黄色计算那个。您的帮助将不胜感激。

Year    Month   Monthly_Score   N_size  YTD_Score
2017    1        70             10       70*10/10
2017    2        80             20       70*10/(10+20) + 80 *20 /(10+20)
2017    3        90             30       70*10/(10+20+30) + 80 * 20 /(10+20+30) 
                                         +90*30/(10+20+30)

【问题讨论】:

  • 你使用的是哪个版本的sql server?

标签: sql sql-server weighted-average


【解决方案1】:

如果您的 SQL Server 版本支持,您可以使用窗口函数SUM

select year,month,monthly_score,n_size,
1.0*sum(monthly_score*n_size) over(partition by year order by month)/
sum(n_size) over(partition by year order by month)
from yourtable

请注意,该值每年都会重置。

编辑:对于 2012 以下支持 outer apply 的 SQL Server 版本。

select y.year,y.month,y.monthly_score,y.n_size,t.ytd_score
from yourtable y
outer apply (select 1.0*sum(monthly_score*n_size)/sum(n_size) as ytd_score 
             from yourtable y1 
             where y.year=y1.year and y1.month<=y.month
            ) t

【讨论】:

  • 太棒了!我认为它应该工作。我刚试过。我会为其他人测试并让您知道。
  • 非常感谢!几个小时以来,我一直在尝试这个。欣赏它。
  • 如果这必须在 SQL Server 2008 中执行,如何执行?请帮忙!
  • 我尝试使用我的表实现您的查询,但结果不一样。(与 excel 相比)。您认为我缺少什么吗?
【解决方案2】:

您可以使用sum 的窗口变量来求和以计算运行总计:

SELECT [Year], [Month], [Monthly_Score], [N_Size],
       SUM([Monthly_Score] * [N_Size]) 
          OVER (ORDER BY [Year], [Month]
          ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) / 
      SUM([N_Size]) 
          OVER (ORDER BY [Year], [Month]
          ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS YTD_Score
FROM  my_table

【讨论】:

  • 非常感谢您的宝贵时间。我只是尝试了类似的东西,但没有 UNBOUNDED PRECEDING 和 CURRENT ROW 并且它起作用了。只是好奇这有什么不同?
  • 如果这必须在 SQL Server 2008 中完成。如何实现?
猜你喜欢
  • 2017-04-22
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 2021-11-21
  • 1970-01-01
相关资源
最近更新 更多