2014-01-21 1 views
0

Я попытался написать функцию, которая использует столбец в качестве параметра. Однако это не сработало. Мне было интересно, как я могу это исправить. Благодарю.sql function использовать столбец как параметр

CREATE FUNCTION dbo.tempMedian(@SCORE INT) 
RETURNS @tempTable TABLE 
(
    onetcode VARCHAR(20), 
    SCORE INT 
) 
AS 
BEGIN 
    WITH median(onetcode, SCORE, RowNum, loc_total) AS 
    (
     SELECT onetcode, 
     @SCORE, 
     ROW_NUMBER() OVER (PARTITION BY onetcode ORDER BY @SCORE), --ORDER SCORE AND ASSIGN ROW NUMBER 
     COUNT(onetcode) OVER (PARTITION BY onetcode) --TOTAL NUMBER OF CASES 
     FROM t AS c 
) 

INSERT @tempTable 
SELECT onetcode, AVG(@SCORE) avgAGW 
FROM median 
WHERE RowNum BETWEEN (loc_total + 1)/2 AND (loc_total+ 2)/2 
GROUP BY onetcode 
    RETURN 
END; 
GO 
+0

Что не работает? Вы получаете ошибку? Или не получать ожидаемые результаты? Какие результаты должны быть тогда? –

+0

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

ответ

0

Используйте сазе

... 
ROW_NUMBER() OVER (
    PARTITION BY [onetcode] 
    ORDER BY 
    CASE @SCORE --Choose sorting column 
     WHEN 1 THEN [Column1] 
     WHEN 2 THEN [Column2] 
     ELSE  [Column3] 
    END 
) 
... 
0

Вот окончательный запрос, который работает для меня. Спасибо за ваши материалы.

CREATE FUNCTION dbo.tempMedian(@col INT) 
RETURNS @tempTable TABLE 
(
    onetcode VARCHAR(50), 
    SCORE FLOAT 
) 
AS 
BEGIN 
    WITH median(onetcode, SCORE, RowNum, loc_total) AS 
(

    SELECT onetcode, 
    CASE @col 
     WHEN 1 THEN A 
     WHEN 2 THEN C 
     ELSE O 
    END, 
    ROW_NUMBER() OVER (PARTITION BY onetcode 
    ORDER BY 
     CASE @col --Choose sorting column 
      WHEN 1 THEN A 
      WHEN 2 THEN C 
      ELSE O 
     END), --ORDER SCORE AND ASSIGN ROW NUMBER 
    COUNT(onetcode) OVER (PARTITION BY onetcode) --TOTAL NUMBER OF CASES 
    FROM dbo.PCIInfoSingleScore131230AfterCleaning AS c 
) 

INSERT @tempTable 
SELECT onetcode, AVG(SCORE) AS median 
FROM median 
WHERE RowNum BETWEEN (loc_total + 1)/2 AND (loc_total+ 2)/2 
GROUP BY onetcode 
RETURN 
END; 
GO 
Смежные вопросы