2014-01-05 94 views
0

我正在创建一个电子商务基准站点。我有我的GETSITES一些问题存储过程:SQL查询存储过程错误

代码:

CREATE PROC USER_S_GETSITES 
    @CategoryID int, 
    @List int, 
    @IsPopular bit, 
    @MaxID int, 
    @Status bit, 
    @Word text 
AS 
    SELECT s.*, c.*, AVG(r.Rate) AS RateAVG, Count(r.ID) AS RateCount 
    FROM Sites AS s 
    INNER JOIN Rates AS r ON r.SiteID = s.ID 
    INNER JOIN Categories AS c ON c.ID = s.CategoryID 
    WHERE (@CategoryID is NULL) OR s.CategoryID = @CategoryID 
     AND (@MaxID is NULL) OR s.ID < @MaxID 
     AND (@Status is NULL) OR s.Status = @Status 
     AND r.Status=1 
     AND (@Word is NULL) OR s.Name LIKE @Word OR s.Description LIKE @Word 
     AND (@IsPopular is NULL) OR [email protected] 
ORDER BY 
    CASE @List WHEN 1 THEN s.ID END ASC, 
    CASE @List WHEN 2 THEN s.ID END DESC, 
    CASE @List WHEN 3 THEN RateAVG END DESC, 
    CASE @List WHEN 4 THEN RateCount END DESC 

我的问题:

消息8120,级别16,状态1,过程USER_S_GETSITES,9号线
列'Sites.ID'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
消息207,级别16,状态1,过程USER_S_GETSITES,行23
无效的列名'RateAVG'。
消息207,级别16,状态1,过程USER_S_GETSITES,行24
无效的列名'RateCount'。

我无法解决这些问题。我该怎么办?

+2

列而不聚集函数(求和,计数等)必须在GROUP BY条款。 – Mihai

+0

将在未来的SQL Server版本中删除'ntext','text'和'image'数据类型。避免在新的开发工作中使用这些数据类型,并计划修改当前正在使用它们的应用程序。改为使用'nvarchar(max)','varchar(max)'和'varbinary(max)'。 [详见这里](http://msdn.microsoft.com/en-us/library/ms187993.aspx) –

+0

每个非聚合列必须在group by子句中提及,我怀疑这意味着你不会获得您希望在选择网站和类别中的每个列时看到的数字。通常做这种事情的方式。是通过它的唯一键获得一个聚合查询和组,然后通过那个/那些键返回到原始数据。 –

回答

1

错误1:包括柱Sites.ID在像group by Sites.ID, ....

错误GROUP BY条款2:CASE @List WHEN 3 THEN AVG(r.Rate) AS RateAVG END DESC

错误3:CASE @List WHEN 4 THEN Count(r.ID) AS RateCount END DESC