从视图中调用用户函数

时间:2011-05-08 18:31:30

标签: sql sql-server tsql

我需要根据另一列(State)的值调用4个单独的用户函数。我在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 个答案:

答案 0 :(得分:1)

当然

HAVING用于后聚合(例如在GROUP BY之后)过滤。 SUM(TotalWedThurMins)是一个汇总。所以使用SUM作为参数的udf进入HAVING not WHERE。

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

答案 1 :(得分:0)

您还可以使用APPLY运算符here's a link来解释用法和选项。 APPLY运算符允许您将表连接到特定类型的函数。