我创建了这个存储过程,它基本上是返回一个办公室列表,其中包含每个办公室内发生的活动类型。我向reportviewer报告的结果,但我注意到,对于每个活动返回它创建一个表 - 所以我可以有5个不同的表,每个表都有自己的活动,但都发生在同一个办公室。我希望报告能够成为每个办公室的一个表格,其中包含与每个办公室一样多的活动。所以我认为,如果我在我的存储过程中分组,我的结果将是我想要的但我得到列错误说:“...在选择列表中无效,因为它不包含在聚合函数或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
答案 0 :(得分:1)
您没有使用任何聚合函数(乍一看),因此您不需要group by
子句。您可以在order by
中完成所有排序,然后在应用程序端处理它时将其提取到不同的数据集中。
示例:
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
}
因此,如果您在网页上构建表格,您可能会在每次点击新办公室ID时结束最后一个表格并开始新表格。这里有一些你需要的额外逻辑,但这应该给你一个想法。
请注意,您的问题与使用存储过程无关,而与您选择和处理数据的方式无关。
答案 1 :(得分:1)
GROUP BY
要求您在列表列表中添加某种聚合函数 - SUM
,AVG
,COUNT
。 GROUP BY
只有与汇总相结合才有意义。
否则,只需使用ORDER BY
语句订购数据。
答案 2 :(得分:0)
我实际上意识到我的问题无法通过某些成员提到的存储过程来解决。由于我在报告中显示结果,因此我重新组织了我的报告和数据集信息,以便存在父子关系,并且从数据集中我的信息被正确组织。我使用了这篇文章提供的解决方案来帮助指导我:post used to help guide me.