我需要根据另一列(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)
有什么建议吗?
答案 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运算符允许您将表连接到特定类型的函数。