SQL UDF按参数分组问题
我对SQL中的GROUPBY子句有一些问题。我有以下基本功能: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 我正在尝试运行以下基
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()