在SQL中选择“值的前25%的平均值”

时间:2013-12-02 18:40:06

标签: sql sql-server tsql stored-procedures

我正在为我的客户编写一个存储过程来填充一些将在稍后用于生成SSRS报告的表。一些数据基于特定的库存公式,这些公式在客户的每个季度数据上运行(由客户发送给他们)。通过将这些结果与来自其他类似大小的客户端的结果进行比较来生成数据的另一部分。他们希望在报告中跟踪的事项之一是该特定比较组的公式结果的前25%的平均值。

为了更好地了解它,想象一下我在临时表中的以下字段:

FormulaID int
Value decimal (18,6)

我想执行以下操作:给定特定FormulaID返回Value前25%的平均值。

我知道如何在SQL中取平均值,但我不知道如何对照特定组的前25%。

我该如何撰写此查询?

2 个答案:

答案 0 :(得分:11)

我想你可以做这样的事......

SELECT AVG(Q.ColA) Avg25Prec
FROM (
      SELECT TOP 25 Percent ColA
      FROM Table_Name
      ORDER BY SomeCOlumn
     ) Q

答案 1 :(得分:1)

根据上面的表格,这是我的所作所为:

select AVG(t.Value)
from (select top 25 percent Value
      from @TempGroupTable
      where FormulaID = @PassedInFormulaID
      order by Value desc) as t

desc 必须,因为percent命令实际上不会进行比较。它只是简单地获取前x个记录,x等于它查询的记录数的25%。因此,order by Value desc行将获取具有最高Value的前25%记录,然后将该信息发送到平均值。

作为所有这一切的旁注,这也意味着如果你想要取代底部 25%,或者你的公式结果就像高尔夫得分(即最低是最好的) ),你需要做的就是删除desc部分,你会很高兴。