Sql 从视图调用用户函数

Sql 从视图调用用户函数,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有4个独立的用户函数,需要根据另一列(State)的值调用它们。我可以让它工作时,我把用户功能后,选择,但我需要它被放置后,有 代码如下: SELECT Fname, Lname, id, State, TotalWedThurMins, StCode FROM dbo.AnnualRegCredits GROUP BY Fname, Lname, id, State, TotalWedThurMins, StCode HAVING (State = 'HI') A

我有4个独立的用户函数,需要根据另一列(State)的值调用它们。我可以让它工作时,我把用户功能后,选择,但我需要它被放置后,有

代码如下:

  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) 
有什么建议吗?

当然有

用于聚合后(如分组后)过滤<代码>总和(TotalWedThurMins)是一个集合。因此,使用SUM作为参数的udf进入了无位置

SUM(totalwedturmins)
在WHERE子句中未定义且无意义

但是,
状态
不是聚合的,可以在WHERE子句中

看起来是这样的。但为什么要分组,然后求和?也许你需要一个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
当然

用于聚合后(如分组后)过滤<代码>总和(TotalWedThurMins)是一个集合。因此,使用SUM作为参数的udf进入了无位置

SUM(totalwedturmins)
在WHERE子句中未定义且无意义

但是,
状态
不是聚合的,可以在WHERE子句中

看起来是这样的。但为什么要分组,然后求和?也许你需要一个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

您还可以在一篇好文章中使用APPLY操作符来解释用法和选项。通过“应用”操作符,可以将表连接到特定类型的函数

您还可以在一篇好文章中使用APPLY操作符来解释用法和选项。通过“应用”操作符,可以将表连接到特定类型的函数

你能更详细地解释一下这个问题吗?我认为你应该把
HAVING(State='HI')
改为
WHERE(State='HI')
。是的,每个状态都必须四舍五入HI'必须四舍五入到最近的四分之一(.25)。FL必须四舍五入到最接近的半小时(.5)。我已经创建并运行了所有函数,但我一直在努力使它们与我视图中的每个状态相匹配。有意义吗?你能更详细地解释一下这个问题吗?我认为你应该把
的HAVING(State='HI')
改为
的WHERE(State='HI')
。是的,每个状态都必须四舍五入HI'必须四舍五入到最近的四分之一(.25)。FL必须四舍五入到最接近的半小时(.5)。我已经创建并运行了所有函数,但我一直在努力使它们与我视图中的每个状态相匹配。有意义吗?谢谢,那会有用的,但我需要一些不同的东西。我发布了错误的代码。以下代码适用于两种状态(HI和FL)。但是,我需要一个不同的MD函数。如何在同一视图中调用不同的函数:选择Fname、Lname、id、State、dbo.GetRoundDownNearestQuarter(TotalWedturmins)作为Expr1,StCode来自dbo.AnnualRegCredits,其中(State='HI')或(State='FL')GROUP BY Fname、Lname、id、State、totalWedturmins、StCodeGreat Union都起作用!谢谢像往常一样,简单的事情永远不会先想到!谢谢,那会有用的,但我需要一些不同的东西。我发布了错误的代码。以下代码适用于两种状态(HI和FL)。但是,我需要一个不同的MD函数。如何在同一视图中调用不同的函数:选择Fname、Lname、id、State、dbo.GetRoundDownNearestQuarter(TotalWedturmins)作为Expr1,StCode来自dbo.AnnualRegCredits,其中(State='HI')或(State='FL')GROUP BY Fname、Lname、id、State、totalWedturmins、StCodeGreat Union都起作用!谢谢像往常一样,简单的事情永远不会先想到!