Sql server 2008 存储过程中的分组错误

Sql server 2008 存储过程中的分组错误,sql-server-2008,stored-procedures,Sql Server 2008,Stored Procedures,我创建了这个存储过程,它基本上是返回一个办公室列表,其中包含每个办公室内发生的活动类型。我向reportviewer报告了结果,但我注意到,对于每个活动返回,它都会创建一个表-因此我可以有5个不同的表,每个表都有自己的活动,但都发生在同一个办公室。我希望报告是每个办公室的一个表格,其中包含的活动与每个办公室的活动一样多。所以我认为,如果我在存储过程中分组,我的结果将是我想要的结果,但我得到的列错误是:“……在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。” 我不知

我创建了这个存储过程,它基本上是返回一个办公室列表,其中包含每个办公室内发生的活动类型。我向reportviewer报告了结果,但我注意到,对于每个活动返回,它都会创建一个表-因此我可以有5个不同的表,每个表都有自己的活动,但都发生在同一个办公室。我希望报告是每个办公室的一个表格,其中包含的活动与每个办公室的活动一样多。所以我认为,如果我在存储过程中分组,我的结果将是我想要的结果,但我得到的列错误是:“……在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。”

我不知道该怎么做,但以下是我的select、from、where、group by语句:

SELECT 
            O.OfficeId,
            O.OfficeName AS Office,
            HT.Description AS HearingType,
            H.HearingDate AS HearingDate,
            CR.Description AS Court,
            CT.[Description]AS CaseType
    FROM Activity H
    INNER JOIN ActivityEntry HE ON H.ActivityEntryId = HE.ActivityEntryId
    INNER JOIN ActivityType HT ON H.ActivityTypeId = HT.ActivityTypeId
    INNER JOIN [Case] C ON H.CaseId = C.CaseId
    INNER JOIN [Office] O ON HE.CreatedByOfficeId = O.OfficeId
    INNER JOIN [User] U ON C.CreatedByUserId = U.UserId
    LEFT OUTER JOIN CaseType CT ON C.CaseTypeId = CT.CaseTypeId
    LEFT OUTER JOIN Court CR ON C.CourtId = CR.CourtId
    WHERE .dbo.DateOnly(HE.HearingDate)BETWEEN @BeginDate AND @EndDate
    GROUP  BY
            O.OfficeId,
            O.OfficeName,
            HT.Description
    ORDER BY O.OfficeId, HT.Description

您没有使用任何聚合函数(乍一看),因此不需要
GROUPBY
子句。您可以在
orderby
中进行所有排序,然后在应用程序端处理时将其提取到不同的数据集中

例如:

select ... from ... order by OfficeID, Description
这将为所有办公室返回一个结果。现在您需要用代码解析它

int OfficeID=-1;
while(recordset.moveToNextRow())
{
    if(currentRecord.OfficeID!=OfficeID)
    {
        //This is a new office, do whatever you need to do to split the data up here
        OfficeID=currentRecord.OfficeID;
    }
    //Process the record as a part of the current office here
}
因此,如果你在网页上构建一个表,你可能会在每次点击新的office ID时结束最后一个表并开始一个新表。这里需要一些额外的逻辑,但这应该给你一个想法


请注意,您的问题与使用存储过程无关,而与您选择和处理数据的方式有关。

分组依据
要求您在列列表中具有某种聚合函数-a
求和
,a
平均值
,a
计数
<代码>分组依据仅在与聚合组合时才有意义


否则,只需使用order BY语句对数据进行排序。

我实际上意识到,我的问题无法通过一些成员提到的存储过程解决。因为我在报告中显示结果,所以我重新组织了报告和数据集信息,以便存在父子关系,并且从数据集中正确组织了我的信息。我使用这篇文章提供的解决方案来帮助指导我:

很抱歉,我对存储过程规则不是很熟悉,我是一个新手,但感谢您通知我,我现在将研究它,看看我能想出什么。谢谢…谢谢你通知我,因为我对使用存储过程还相当陌生,不熟悉它的所有规则和用法。我主要关心的是,我想根据每个活动的办公室对其进行排序。因为我在同一个办公室得到了5张不同的桌子,每张桌子都有不同的活动。我想要它,这样每个办公室都有一张表,表中列出了它的活动。谢谢…你这么做是违背了数据库的设计。你想从数据库中获取一个数据集,然后从那里分别处理它的每个部分。好的,我想我对我需要做的事情有一个很好的想法,我会继续尝试,然后回来。我以前这样做过一次,实际上我在代码中使用foreach循环来组织输出数据,但为此我没有使用存储过程。谢谢您的帮助:)存储过程在这里不会为您更改任何内容。一旦你把数据拿回来,你就可以像直接选择一样使用它,或者即使你把数据硬编码成一个二维数组。