返回中位数的函数

时间:2014-09-22 19:07:22

标签: sql sql-server function sql-server-2000 median

我想创建一个返回字段中位数的函数。我正在使用sql 2000。 我写道:

create function mediana 
(@tabla, @campo)
returns int
as
begin

declare @Median integer
return  @Median = 

(
   (SELECT MAX(@campo) FROM
     (SELECT TOP 50 PERCENT dia
      FROM @tabla
      ORDER BY @campo) AS t
    )
 + (SELECT MIN(@campo) FROM
     (SELECT TOP 50 PERCENT  @campo
      FROM @tabla ORDER BY @campo DESC) AS b
    )

) / 2.0 ;

但我收到很多错误。如何解决这个问题,我也希望将此功能应用于由其他fiels分组的数据。这段代码可以实现吗?

ps:我以前从未在sql中创建过一个函数。

感谢

1 个答案:

答案 0 :(得分:-1)

当将列名的表名作为变量传递时,您将最终使用Dynamic sql,并且您不能在用户定义的函数中使用Dynamic sql,这将为您提供存储过程的唯一选项, 既然你要返回一个值,那么OUTPUT参数就是你的朋友......

ALTER PROCEDURE mediana 
 @tabla nvarchar(128)
,@campo nvarchar(128)
,@Median DECIMAL(10,2) OUTPUT
AS
BEGIN
   SET NOCOUNT ON;
DECLARE @Sql NVARCHAR(2000);

SET @Sql = N'SET @Median =  ( SELECT 
                (
                 (SELECT MAX('+ QUOTENAME(@campo) +') FROM
                   (SELECT TOP 50 PERCENT '+ QUOTENAME(@campo) +' FROM '+ QUOTENAME(@tabla) 
                 + N' ORDER BY '+ QUOTENAME(@campo) +') AS BottomHalf)
                 +
                 (SELECT MIN('+ QUOTENAME(@campo) +') FROM
                   (SELECT TOP 50 PERCENT '+ QUOTENAME(@campo) +' FROM '+ QUOTENAME(@tabla) 
                 + N' ORDER BY '+ QUOTENAME(@campo) +' DESC) AS TopHalf)
                ) / 2  )'

EXECUTE sp_executesql @Sql
                     ,N'@Median DECIMAL(10,2) OUTPUT'
                     ,@Median OUTPUT

END