вызвать функцию пользователя из вида - PullRequest
1 голос
/ 08 мая 2011

У меня есть 4 отдельные пользовательские функции, которые мне нужно вызывать на основе значения другого столбца (State).Я могу заставить его работать, когда я помещаю пользовательскую функцию после SELECT, однако мне нужно, чтобы она была помещена после HAVING.

Вот код:

  SELECT Fname, Lname, id, State, TotalWedThurMins, StCode
    FROM dbo.AnnualRegCredits
GROUP BY Fname, Lname, id, State, TotalWedThurMins, StCode
  HAVING (State = 'HI') 
     AND (dbo.roundnearestquarter(SUM(TotalWedThurMins)) > 0) 

Есть предложения?

Ответы [ 2 ]

1 голос
/ 08 мая 2011

Конечно

HAVING для постагрегатной (например, после GROUP BY) фильтрации. SUM(TotalWedThurMins) - это совокупность. Таким образом, udf, использующий SUM в качестве параметра, переходит в НЕ ГДЕ.

SUM(TotalWedThurMins) не определено и не имеет смысла в предложении WHERE

Однако State не агрегируется и может быть в предложении WHERE.

Так это выглядит так. Но почему GROUP BY, а затем SUM TotalWedThurMins? Возможно, вам нужно предложение OVER для управления обоими ... (не уверен, что это правильный синтаксис)

SELECT Fname, Lname, id, State, TotalWedThurMins, StCode
FROM dbo.AnnualRegCredits
WHERE (State = 'HI') 
GROUP BY Fname, Lname, id, State, TotalWedThurMins, StCode
HAVING (dbo.roundnearestquarter(SUM(TotalWedThurMins) OVER ()) > 0) 

Альтернативная формулировка с использованием OVER и CTE:

WITH CTE AS
(
    SELECT Fname, Lname, id, State, TotalWedThurMins, StCode,
           SUM(TotalWedThurMins) OVER () AS SumTotalWedThurMins
    FROM dbo.AnnualRegCredits
    WHERE State = 'HI'
)
SELECT 
     Fname, Lname, id, State, TotalWedThurMins, StCode
FROM
    CTE
WHERE
    dbo.roundnearestquarter(SumTotalWedThurMins) > 0
0 голосов
/ 09 мая 2011

Вы также можете использовать оператор APPLY , вот ссылка на хорошую статью, объясняющую использование и опции.Оператор APPLY позволяет объединять таблицы с определенными типами функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...