Ошибка группировки по в хранимой процедуре

#sql-server-2008 #stored-procedures

#sql-server-2008 #хранимые процедуры

Вопрос:

Я создал эту хранимую процедуру, которая в основном должна возвращать список офисов с типом действий, которые выполняются в каждом офисе. Результаты, о которых я сообщил 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
  

Ответ №1:

GROUP BY требуется, чтобы в вашем списке столбцов была какая-либо агрегатная функция — a SUM , an AVG , a COUNT . GROUP BY имеет смысл только в сочетании с aggregate.

В противном случае просто упорядочьте свои данные с помощью ORDER BY инструкции.

Комментарии:

1. Извините, я не очень хорошо знаком с правилами хранимых процедур, я довольно новичок, но спасибо, что сообщили мне, я изучу это прямо сейчас и посмотрю, что я могу придумать. Спасибо…

Ответ №2:

Вы не используете никаких агрегатных функций (во всяком случае, на первый взгляд), поэтому вам не нужно 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
}
  

Итак, если бы вы создавали таблицу на веб-странице, вы, возможно, завершали бы последнюю таблицу и начинали новую таблицу каждый раз, когда вводите новый идентификатор office. Здесь вам понадобится некоторая дополнительная логика, но это должно дать вам представление.

Обратите внимание, что ваша проблема не имеет ничего общего с использованием хранимой процедуры, а все связано с тем, как вы выбираете и обрабатываете данные.

Комментарии:

1. Спасибо, что сообщили мне, поскольку я довольно новичок в использовании хранимых процедур и не знаком со всеми их правилами и применениями. Моя главная проблема заключается в том, что я хочу упорядочить каждое действие в соответствии с его офисом. Потому что я получаю 5 разных таблиц для одного и того же office, каждая с разным действием. я хочу, чтобы у меня была одна таблица для каждого офиса с перечисленными в ней действиями. Спасибо…

2. Вы идете вразрез с дизайном базы данных, пытаясь это сделать. Вы хотите получить один набор данных из базы данных и оттуда обрабатывать каждый его раздел отдельно.

3. хорошо, я думаю, у меня есть хорошая идея о том, что мне нужно сделать, поэтому продолжу и попробую это и вернусь. Способ, которым я делал это однажды раньше, заключается в том, что я фактически использовал циклы foreach в своем коде для организации выходных данных, но для этого я не использовал хранимую процедуру. Спасибо за вашу помощь 🙂

4. Хранимая процедура здесь для вас ничего не меняет. Как только вы получите данные обратно, вы будете работать с ними так же, как с прямым выбором, или даже если вы жестко закодировали данные в двумерный массив.

Ответ №3:

Я действительно понял, что моя проблема не может быть решена с помощью моей хранимой процедуры, как упоминалось некоторыми участниками. Поскольку я отображаю результаты в своем отчете, я реорганизовал свой отчет и информацию о наборе данных таким образом, чтобы существовала родительская и дочерняя связь, и из набора данных моя информация была организована должным образом. Я использовал решения, предложенные в этом сообщении, чтобы помочь мне сориентироваться: сообщение использовалось, чтобы помочь мне сориентироваться.