我正在尝试在ssrs 2012中生成一个显示中位数成本的列。
我一直在搜索这个问题,并编写了一个PERCENTILE_CONT查询来尝试实现这一目标。
这是我正在使用的查询:
SELECT srt.Name,
cast(sum(sr.price) as int) as AvgCost,
cast(sum(sr.cost) as int) as AvgTransCost,
cast(avg(sr.TotalTimeSpent) as int) as TotalTimeSpent,
percentile_cont(.5) WITHIN GROUP(ORDER BY sum(sr.price)) OVER(PARTITION BY srt.Name) AS MedianSpend
from
ServiceReq sr, ServiceReqTemplate srt
运行报告时,结果如下:
这是中位数吗?为什么所有其他avgcosts和medians都一样?如果我将PERCENTILE_CONT(.5)更改为PERCENTILE_CONT(.9),则Median列没有变化 - 这使我相信这是中位数的错误值:(
答案 0 :(得分:1)
您正在使用PERCENTILE_CONT
(CONT =连续)
根据SQL Server中列值的连续分布计算百分位数。结果是内插的,可能不等于列中的任何特定值。
(http://msdn.microsoft.com/en-us/library/hh231473.aspx)
而你想要的是PERCENTILE_DISC
(DISC =离散)
对于给定的百分位值P,PERCENTILE_DISC
对ORDER BY子句中的表达式值进行排序,并返回大于或等于CUME_DIST值最小的值(相对于相同的排序规范)例如,PERCENTILE_DISC (0.5)
将计算表达式的第50个百分位数(即中位数)。