:: Visual Foxpro, Foxpro for DOS
select sql runtime error
glaz58
Автор

Сообщений: 812
Откуда: Воронеж
Дата регистрации: 09.02.2008
Уважаемые знатоки! Понадобилось расширить работающую SQL-команду. Раньше команда была такая:
Select smetarab->nrazd, Min(razdel->naimrazd) As naimrazd, Sum(Round(smetarab->tekstoim,cop)) As sum_razd;
from smetarab, razdel Where smetarab->nrazd=razdel->nrazd Group By smetarab->nrazd Order By smetarab->nrazd Into cursor tabrazd
и она работала. После изменения (понадобилось увеличить список полей)
Select smetarab->nrazd, Min(razdel->naimrazd) As naimrazd, Sum(Round(smetarab->tekstoim,cop)) As sum_razd,;
round(smetarab->osn_zarp*smetarab->KOLVO,cop)+round(smetarab->expl_mech*smetarab->KOLVO,cop)+round(smetarab->mtrls*smetarab->KOLVO,cop) as sum_przatr;
from smetarab, razdel Where smetarab->nrazd=razdel->nrazd Group By smetarab->nrazd Order By smetarab->nrazd Into cursor tabrazd
Получаю сообщение об ошибке в рантайме: SQL: Group by clause is missing or invalid
Наверно в Select SQL нельзя в строке применять вычисления?
Ratings: 0 negative/0 positive
Re: select sql runtime error
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
glaz58
Получаю сообщение об ошибке в рантайме: SQL: Group by clause is missing or invalid Наверно в Select SQL нельзя в строке применять вычисления?
Вот интересно, как исходя из сообщения о неправильном Group by делается вывод о недопустимости вычислений? По какой логике?
А ничего, что Вы добавили простое поле в запрос с группировкой? Как сие поле в группировке обрабатывать Вы не пробовали указать?


------------------
Лень - это неосознанная мудрость.




Исправлено 1 раз(а). Последнее : ssa, 06.11.20 20:03
Ratings: 0 negative/0 positive
Re: select sql runtime error
Владимир Максимов

Сообщений: 14094
Откуда: Москва
Дата регистрации: 02.09.2000
Ну, я понимаю, что писать надо так, чтобы враги не догадались, что вообще написано. Но сам-то как такой код читаешь?

Select ;
smetarab->nrazd, ;
Min(razdel->naimrazd) As naimrazd, ;
Sum(Round(smetarab->tekstoim,cop)) As sum_razd, ;
round(smetarab->osn_zarp*smetarab->KOLVO,cop)+ ;
round(smetarab->expl_mech*smetarab->KOLVO,cop)+ ;
round(smetarab->mtrls*smetarab->KOLVO,cop) as sum_przatr ;
from smetarab, razdel ;
Where smetarab->nrazd=razdel->nrazd ;
Group By smetarab->nrazd ;
Order By smetarab->nrazd ;
Into cursor tabrazd

В случае использования группировки в опции Select могут быть указаны поля, перечисленные в Group By. Все остальные поля должны быть внутри аггрегирующих функций таких как SUM(), MAX(), MIN()

Последнее вычисляемое поле - не соответствует этому правилу. Если Вы считаете, что это вычисляемое значение одинаково для любых записей в рамках группы, то используйте MAX()

MAX(round(smetarab->osn_zarp*smetarab->KOLVO,cop)+ ;
round(smetarab->expl_mech*smetarab->KOLVO,cop)+ ;
round(smetarab->mtrls*smetarab->KOLVO,cop);
) as sum_przatr ;
Ratings: 0 negative/0 positive
Re: select sql runtime error
Sawradym

Сообщений: 2244
Откуда: Винница
Дата регистрации: 15.05.2007
Настройка SET ENGINEBEHAVIOR 80 позволит работать Вашему коду, но лучше сразу учиться писать правильно.



Исправлено 1 раз(а). Последнее : Sawradym, 06.11.20 20:17
Ratings: 0 negative/0 positive
Re: select sql runtime error
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
А для повышения читабельности запроса я бы сделал примерно так:
Select s.nrazd, Min(r.naimrazd) As naimrazd, Sum(Round(s.tekstoim,cop)) As sum_razd,;
Max(round(s.osn_zarp*s.KOLVO,cop)+round(s.expl_mech*s.KOLVO,cop)+round(s.mtrls*s.KOLVO,cop)) as sum_przatr ;
from smetarab as s, razdel as r ;
Where s.nrazd=r.nrazd Group By s.nrazd Order By s.nrazd Into cursor tabrazd
или даже так:
Select t.*, naimrazd ;
from ;
(Select nrazd, Sum(Round(tekstoim,cop)) As sum_razd,;
round(osn_zarp*KOLVO,cop)+round(expl_mech*KOLVO,cop)+round(mtrls*KOLVO,cop) as sum_przatr ;
from smetarab Group By nrazd ;
) t ;
inner join razdel as t on t.nrazd = r.nrazd ;
Order By nrazd Into cursor tabrazd
Код не проверял ибо на коленке, да и не на чем.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: select sql runtime error
glaz58
Автор

Сообщений: 812
Откуда: Воронеж
Дата регистрации: 09.02.2008
Это не помогло.
Ratings: 0 negative/0 positive
Re: select sql runtime error
glaz58
Автор

Сообщений: 812
Откуда: Воронеж
Дата регистрации: 09.02.2008
Спасибо за очень точный и бережный к коду ответ (в том смысле, что просто указано на ошибку без изменений). Мне просто надо было применить SUM по аналогии с другим вычисляемым полем и всё заработало. И дополнительный вопрос по SQL: почему к первому полю (smetarab.nrazd) не применено никаких агрегирующих функций, но это не вызывает ошибки?



Исправлено 1 раз(а). Последнее : glaz58, 06.11.20 20:50
Ratings: 0 negative/0 positive
Re: select sql runtime error
glaz58
Автор

Сообщений: 812
Откуда: Воронеж
Дата регистрации: 09.02.2008
Спасибо за внимание к моей просьбе, но у Вас слишком сложные для меня изменения моего кода.
Ratings: 0 negative/0 positive
Re: select sql runtime error
Владимир Максимов

Сообщений: 14094
Откуда: Москва
Дата регистрации: 02.09.2000
glaz58
И дополнительный вопрос по SQL: почему к первому полю (smetarab.nrazd) не применено никаких агрегирующих функций, но это не вызывает ошибки?

По той причине, что это именно то поле, которое указано в опции Group By. Нет неоднозначности в определении его значения в результирующей выборке
Ratings: 0 negative/0 positive
Re: select sql runtime error
Sawradym

Сообщений: 2244
Откуда: Винница
Дата регистрации: 15.05.2007
Sawradym
Настройка SET ENGINEBEHAVIOR 80 позволит работать Вашему коду, но лучше сразу учиться писать правильно.

Склероз подвел. Прошу прощения. Имелось ввиду SET ENGINEBEHAVIOR 70.


------------------
Ratings: 0 negative/0 positive
Re: select sql runtime error
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
glaz58
Спасибо за внимание к моей просьбе, но у Вас слишком сложные для меня изменения моего кода.
Сложные? Ну ладно, второй вариант, а в первом то что сложного если всего лишь из исходного кода удалена куча лишнего текста? Присмотритесь получше, это тот же Ваш код, только причесанный.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: select sql runtime error
glaz58
Автор

Сообщений: 812
Откуда: Воронеж
Дата регистрации: 09.02.2008
У меня конкретная ошибка в определении вычисляемого поля, поэтому SET ENGINEBEHAVIOR тут ни причём. Наиболее точно ответил Владимир Максимов, просто ткнул пальцем в нужное место, ничего не изменяя.
Ratings: 0 negative/0 positive
Re: select sql runtime error
glaz58
Автор

Сообщений: 812
Откуда: Воронеж
Дата регистрации: 09.02.2008
Я действительно благодарен Вам за внимание к моему вопросу, для меня лучше всего ответил Владимир Максимов. Он просто ткнул пальцем в конкретное место в тексте, ничего в нём не меняя. Я просто не использую такие слова, как "inner", "join", потому что пока не изучил их назначения. Обходился без них.



Исправлено 1 раз(а). Последнее : glaz58, 07.11.20 12:42
Ratings: 0 negative/0 positive
Re: select sql runtime error
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
glaz58
Я просто не использую такие слова, как "inner", "join", потому что пока не изучил их назначения. Обходился без них.
А где Вы их обнаружили в первом варианте? Или еще не поняли, что я привел 2 варианта запроса?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: select sql runtime error
glaz58
Автор

Сообщений: 812
Откуда: Воронеж
Дата регистрации: 09.02.2008
В первом варианте мне показалось избыточным добавление "from smetarab as s, razdel as r ;". В любом случае, спасибо, я уже принял вариант, который меня устраивает, который соответствует моим навыкам.



Исправлено 1 раз(а). Последнее : glaz58, 07.11.20 13:27
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 21 Владимир Максимов  (Гостей: 20)

© 2000-2024 Fox Club 
Яндекс.Метрика