2014-09-22 2 views
-3

Я хочу создать функцию, которая возвращает медиану поля. Я работаю с 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 ; 

Но я получаю много ошибок. Как я могу это решить, также хотел бы применить эту функцию к данным, сгруппированным по другим типам. Возможно ли это с помощью этого кода?

ps: Я никогда раньше не создавал функцию в sql.

благодаря

+0

Ну где вы нашли синтаксис как 'return @Median ='? Ты это сделал? Я имею в виду, что * есть * [документация для консультаций] (http://technet.microsoft.com/en-us/library/aa258261 (v = sql.80) .aspx). –

+3

Вам нужно использовать динамический SQL, если вы передаете имя таблицы. Я не думаю, что SQL Server 2000 поддерживает параметры, связанные с таблицей, и синтаксис в любом случае не подходит для этого. –

+0

'Я получаю много ошибок' - и эти ошибки ...? – LittleBobbyTables

ответ

-1

При передаче имен таблицы из столбцов имена, как переменные, вы будете в конечном итоге с помощью динамического SQL, и вы не можете использовать динамический 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 
+0

Спасибо. Как я могу использовать его? Будет что-то вроде mediana (@ tabla = tbl1, @ campo = field1) ??? – GabyLP

+0

Вы не сможете использовать это в некоторых операторах, хотя – LittleBobbyTables

+0

Не тестировал его раньше, протестировал его и он работает –