2015-05-22 118 views
0

我正在MS SQL SERVER 2012中构建存储过程。我想要显示当天的平均级别。sql server中的每个GROUP BY表达式错误

CREATE PROCEDURE [dbo].[AverageP] 
    @UserID INT 
AS 
BEGIN 
    SELECT DAY(GETDATE()), AVG(Level) AS AvgLevel 
    FROM tab1 
    WHERE UserID = @UserID 
    GROUP BY DAY(GETDATE()) 
END 

但我得到这个错误:

Msg 164, Level 15, State 1, Procedure AverageP, Line 9 Each GROUP BY expression must contain at least one column that is not an outer reference.

请帮我解决这个错误!

回答

1

你想要一个where子句,而不是group by。这样的事情:

BEGIN 
    SELECT CAST(GETDATE() as DATE), AVG(Level) AS AvgLevel 
    FROM tab1 
    WHERE UserID = @UserID AND 
      tabl.SOMEDATEFIELD >= cast(GETDATE() as DATE) and 
      tab1.SOMEDATEFIELD < cast(GETDATE() + 1 as DATE) 
END 
0

这是抱怨,因为你不是由tab1中的任何内容分组,但在当前日期当天。

请注意Day()是当天的数字,就像今天是22,因为它是5月22日。如果您希望查找所有星期五的平均值,则需要使用Weekday()。

如果你只是希望你的tab1中的数据在本月中的所有22个月的平均水平,你可能根本就不会这么说。在tab1中是否有一个日期列,意思是获取当天的日期,然后在where列中说getdate()的日期等于该日期列的日期?

0

其实你应该可以在没有组的情况下运行它。

SELECT DAY(GETDATE()) as [Day], AVG(Level) AS AvgLevel 
    FROM tab1 
    WHERE UserID = @UserID 

但是正如戈登指出的那样,我们认为你只是想过滤一天。无论哪种方式分组是多余的。