【问题标题】:sql group by clause errorsql group by子句错误
【发布时间】:2014-02-04 19:48:25
【问题描述】:

这是错误

消息 8120,级别 16,状态 1,过程后续更新,第 10 行
选择列表中的“TopicsComplete.TopicCreationDate”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

这是在添加这两行之后,我需要计算一个单独的表行(行数不是topicid 的计数)并在结果中包含任何想法?谢谢

,COUNT(DISTINCT MC.topicid) AS NewMessagesCount

LEFT OUTER JOIN Messages AS MC ON MC.TopicId = T.TopicId AND MC.userid = @id

@id int = null
,@UserGroupId int = null
AS
SELECT
*
FROM
(SELECT
ROW_NUMBER()
        OVER ( ORDER BY TopicOrder desc
                  , CASE WHEN M.MessageCreationDate > T.TopicCreationDate 
                        THEN M.MessageCreationDate
                        ELSE T.TopicCreationDate
                    END desc )
    AS RowNumber,
T.TopicId, T.TopicTitle, T.TopicShortName, T.TopicDescription, T.TopicCreationDate, T.TopicViews, T.TopicReplies, T.UserId, T.TopicTags, T.TopicIsClose, T.TopicOrder, T.LastMessageId, T.UserName, M.MessageCreationDate, T.ReadAccessGroupId, T.PostAccessGroupId, U.UserGroupId, U.UserPhoto, T.UserFullName ,M.UserId AS MessageUserId ,MU.UserName AS MessageUserName
,COUNT(DISTINCT MC.topicid) AS NewMessagesCount

FROM            TopicsComplete AS T  
                 LEFT OUTER JOIN Messages AS M ON M.TopicId = T.TopicId AND M.MessageId = T.LastMessageId AND M.Active = 1  
                 LEFT OUTER JOIN Messages AS MC ON MC.TopicId = T.TopicId AND MC.userid = @id
                 INNER JOIN Users AS U ON U.UserId = T.UserId
LEFT JOIN Users MU ON MU.UserId = M.UserId

WHERE   EXISTS
(SELECT  * FROM    TopicsComplete
                   LEFT OUTER JOIN Messages AS M ON M.TopicId = T.TopicId AND M.MessageId = T.LastMessageId AND M.Active = 1 INNER JOIN
                   topicfollows AS TF ON T.TopicId != TF.topicid INNER JOIN
                   Users AS U ON U.UserId = T.UserId LEFT OUTER JOIN
                   Users AS MU ON MU.UserId = M.UserId
                   WHERE        (T.UserId = @id)

UNION SELECT  * FROM    TopicsComplete
                        LEFT OUTER JOIN Messages AS M ON M.TopicId = T.TopicId AND M.MessageId = T.LastMessageId AND M.Active = 1 INNER JOIN
                        topicfollows AS TF ON T.TopicId = TF.topicid INNER JOIN
                        Users AS U ON U.UserId = T.UserId LEFT JOIN 
                        Users MU ON MU.UserId = M.UserId
                        WHERE        (TF.userid = @id)
      )
) T

【问题讨论】:

    标签: sql sql-server stored-procedures


    【解决方案1】:

    当您在select 中有一个聚合函数时,SQL Server 相当合理地假定您要进行聚合。所有不在聚合函数中的列都应该在group by 子句中。

    在您的情况下,您在 select 表达式中有 COUNT(DISTINCT MC.topicid) AS NewMessagesCount。所有其他列都应该在group by 中。没有group by,但无论如何你都会收到错误,因为应该有一个。

    【讨论】:

      【解决方案2】:

      您需要在GROUP BY 子句中包含任何未包含在聚合(最大值、最小值、计数、总和等)中的列。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-29
        • 2013-05-01
        • 1970-01-01
        相关资源
        最近更新 更多