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