SQL UDF按参数分组问题

SQL UDF按参数分组问题,sql,Sql,我对SQL中的GROUPBY子句有一些问题。我有以下基本功能: CREATE FUNCTION dbo.fn_GetWinsYear (@Year int) RETURNS int AS BEGIN declare @W int select @W = count(1) from tblGames where WinLossForfeit = 'W' and datepart(yyyy,Date) = @Year return @W END 我正在尝试运行以下基

我对SQL中的GROUPBY子句有一些问题。我有以下基本功能:

CREATE FUNCTION dbo.fn_GetWinsYear (@Year int)
RETURNS int
AS
BEGIN
  declare @W int
  select @W = count(1) 
    from tblGames 
    where WinLossForfeit = 'W' and datepart(yyyy,Date) = @Year
  return @W
END
我正在尝试运行以下基本查询:

select dbo.fn_GetWinsYear(datepart(yyyy,date)) 
from tblGames 
group by datepart(yyyy,date)
但是,我遇到以下错误消息:“tblGames.Date”列在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中


你知道为什么会这样吗?仅供参考,我知道我可以删除该函数并合并为一个调用,但如果可能,我希望保留该函数。

我认为您应该这样调用函数

select dbo.fn_GetWinsYear(datepart(yyyy,getdate())) 

基本上,您只是将一年时间传递给函数,函数返回该年的获胜次数

如果你不知道年份,你的函数可能看起来像这样

CREATE FUNCTION dbo.fn_GetWinsYear () 
RETURNS @tblResults TABLE
( W INT, Y INT )

AS 
BEGIN 

    INSERT @tblResults

    SELECT count(1), datepart(yyyy,[Date]) 
    FROM tblGames  
    WHERE WinLossForfeit = 'W'
    GROUP BY datepart(yyyy,[Date]) 


    RETURN
END

SELECT * FROM dbo.fn_GetWinsYear()

这会起作用,但是我需要从tblGames.Date列中提取年份。因为您已经知道年份,只需将其添加到查询中即可。选择dbo.fn_GetWinsYear(datepart(yyy,getdate())),datepart(yyy,getdate()),但我还不知道年份。它可以是过去X年内的任何一年。(每年应返回1行。)@Germ,这提供了一个可行的解决方案。谢谢你的帮助。我不建议你采用这种方法。你在一个基于集合的世界里思考OOP;性能不太可能很好地扩展。是的,我知道这并不理想,但我只是想弄清楚为什么会发生这种情况。我认为您的功能没有任何问题。
CREATE FUNCTION dbo.fn_GetWinsYear () 
RETURNS @tblResults TABLE
( W INT, Y INT )

AS 
BEGIN 

    INSERT @tblResults

    SELECT count(1), datepart(yyyy,[Date]) 
    FROM tblGames  
    WHERE WinLossForfeit = 'W'
    GROUP BY datepart(yyyy,[Date]) 


    RETURN
END

SELECT * FROM dbo.fn_GetWinsYear()