2010-04-26 70 views
0

我在使用SQL中的group by子句時遇到了一些問題。我有以下基本功能:SQL UDF組按參數問題

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子句中。

任何想法爲什麼會發生這種情況?僅供參考,我知道我可以刪除該功能並將其合併爲一個調用,但如果可能的話,我想保留該功能。

+0

我不建議採取這種做法。你在基於SET的世界中正在考慮OOP。績效不可能很好地擴展。 – 2010-04-26 22:11:31

+0

是的,我知道這並不理想,但我只是想弄明白爲什麼會發生。 – 2010-04-26 22:19:29

+0

我沒有看到你的功能有任何問題。 – Germ 2010-04-26 22:27:44

回答

1

我認爲你應該這樣調用你的函數。

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

OR

select dbo.fn_GetWinsYear('2010') 

基本上你一年都只是路過你的函數和函數返回勝當年的數量。

如果你不知道這一年做的,你的函數可以是這個樣子......

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() 
+0

這將工作,但我需要從tblGames.Date列中提取年份。 – 2010-04-26 22:09:10

+0

由於您已經知道這一年,只需將其添加到您的查詢。 選擇dbo.fn_GetWinsYear(日期部分(YYYY,GETDATE())),日期部分(YYYY,GETDATE()) – Germ 2010-04-26 22:20:50

+0

但我還不知道一年。它可能是過去X年內的任何一年。 – 2010-04-27 01:03:40