我想创建一个返回字段中位数的函数。我正在使用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中创建过一个函数。
感谢
答案 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