powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / GROUP BY и агрегаты: варианты в разных версиях фокспро
20 сообщений из 20, страница 1 из 1
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36474307
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Во время работы возникла ошибка: Group by is missing or invalid. При этом в селекте есть агрегат по полю (sum()). Работаю в 9м фоксе. Нашел здесь интересную тему. Оказывается в разных версиях фокса подобные ситуации воспринимаются по разному.
Чтобы переделать запрос для 9ки нужно группировать по всем полям селекта, исключая агрегатное. Сделал -- ошибки нет, но и ожидаемого результата тоже: он только группирует одинаковые записи, а не объединяет их в одну.
Код: plaintext
1.
SELECT rn,name_nom,artikul,sum(cnt_portion) as PORTION,BRUTTO FROM currProdPay GROUP BY rn, name_nom,artikul,BRUTTO
В чем причина?
...
Рейтинг: 0 / 0
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36474314
донМахито он только группирует одинаковые записи, а не объединяет их в одну.
Переведите на общепонятный язык. Что Вы ожидаете и что происходит.
...
Рейтинг: 0 / 0
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36474338
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чтобы Вам правильно ответили:
1. покажите тестовую табличку с данными
2. нарисуйте и опишите требуемый результат
...
Рейтинг: 0 / 0
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36474416
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Исходная табличка, отобрана в курсор currProdPay:
rn,name_nom,artikul,cnt_portion,BRUTTO
Выводит (привожу основные поля):
Молоко 10
Масло 5
Масло 5
Морковь 2
Мясо 100
Мясо 100
Картофель 50
Некоторые поля повторяются. Нужно все повторяющиеся поля заменить одним и сложить все их соответствующие поля:
Молоко 10
Масло 10
Морковь 2
Мясо 200
Картофель 50
Сейчас он ничего не делает -- только группирует. Даже без group by не работает.
...
Рейтинг: 0 / 0
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36474457
донМахитоИсходная табличка, отобрана в курсор currProdPay:
rn,name_nom,artikul,cnt_portion,BRUTTO
Выводит (привожу основные поля):
Молоко 10
Масло 5
Масло 5
Морковь 2
Мясо 100
Мясо 100
Картофель 50
Некоторые поля повторяются. Нужно все повторяющиеся поля заменить одним и сложить все их соответствующие поля:
Молоко 10
Масло 10
Морковь 2
Мясо 200
Картофель 50
Сейчас он ничего не делает -- только группирует. Даже без group by не работает.Вы можете наконец ответить, что в Вашем понимании есть "группирует"? Как ЭТО выгдлядит? Или первый список и есть "группировка"? Если так, то каковы неосновные поля? Например, у строк с маслом они одинаковые или отличаются?
...
Рейтинг: 0 / 0
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36474464
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВыводит (привожу основные поля):

нужно не только основные, а и все, все, так как если поле rn уникальное,
то и не будет группировки

ttpp kk10 20 3015 16 20
...
Рейтинг: 0 / 0
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36474477
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дайте нам таблички в таком виде, в котором я нарисовал

это теги CSV /CSV

rnname_nomartikulcnt_portionBRUTTO1ffffffffhh455
...
Рейтинг: 0 / 0
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36474557
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проходящий.Вы можете наконец ответить, что в Вашем понимании есть "группирует"? Как ЭТО выгдлядит?
Блин, я же пример привел. Есть список продуктов. Некоторые продукты повторяются, но с разными значениями: количество порций, брутто. Нужно вывести общее количество порций и брутто для каждого продукта.

прошелмимо,
currProdPay
*rn;*name_nom;*cnt_portion;*BRUTTO000g;Молоко;10;5000f;Картофель;10;50000p;Масло;5;3000p;Масло;10;20003;Морковь;5;20004;Мясо;10;1000004;Мясо;5;100

Нужно получить:
*rn;*name_nom;*cnt_portion;*BRUTTO000g;Молоко;10;5000f;Картофель;10;50000p;Масло;15;50003;Морковь;5;20004;Мясо;15;200
...
Рейтинг: 0 / 0
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36474570
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
*rn;*name_nom;*cnt_portion;*BRUTTO000g;Молоко;10;5000f;Картофель;10;50000p;Масло;5;3000p;Масло;10;20003;Морковь;5;20004;Мясо;10;1000004;Мясо;5;100


*rn;*name_nom;*cnt_portion;*BRUTTO000g;Молоко;10;5000f;Картофель;10;50000p;Масло;15;50003;Морковь;5;20004;Мясо;15;200
...
Рейтинг: 0 / 0
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36474577
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не получилось. Черт.
...
Рейтинг: 0 / 0
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36474590
донМахитопроходящий.Вы можете наконец ответить, что в Вашем понимании есть "группирует"? Как ЭТО выгдлядит?
Блин, я же пример привел.Блин, это Вам только кажется. Есть список продуктов. Некоторые продукты повторяются, но с разными значениями: количество порций, брутто. Нужно вывести общее количество порций и брутто для каждого продукта.

000p;Масло;5;3
000p;Масло;10;2
Ну вот и объяснение. ЭТО для компа РАЗНЫЕ группы. У него нет основных и неосновных полей для группировки. Он группирует по ВСЕМ указанным в group by полям без деления на основные и неосновные.
...
Рейтинг: 0 / 0
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36474611
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Create cursor currProdPay (rn c( 4 ), name_nom v( 10 ), cnt_portion int, BRUTTO int)
Insert into currProdPay values ("000g", "Молоко",  10 ,  5 )
Insert into currProdPay values ("000f", "Картофель",  10 ,  50 )
Insert into currProdPay values ("000p", "Масло",  5 ,  3 ) 
Insert into currProdPay values ("000p", "Масло",  10 ,  2 )
Insert into currProdPay values ("0003", "Морковь",  5 ,  2 ) 
Insert into currProdPay values ("0004", "Мясо",  10 ,  100 )
Insert into currProdPay values ("0004", "Мясо",  5 ,  100 )
 
SELECT rn, ;
       name_nom, ;
       sum(cnt_portion) as PORTION, ;
       Sum(BRUTTO) ;
    FROM currProdPay ;
    GROUP BY rn, name_nom
...
Рейтинг: 0 / 0
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36475162
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
донМахитоВо время работы возникла ошибка: Group by is missing or invalid. При этом в селекте есть агрегат по полю (sum()). Работаю в 9м фоксе. Нашел здесь интересную тему. Оказывается в разных версиях фокса подобные ситуации воспринимаются по разному.
Чтобы переделать запрос для 9ки нужно группировать по всем полям селекта, исключая агрегатное. Сделал -- ошибки нет, но и ожидаемого результата тоже: он только группирует одинаковые записи, а не объединяет их в одну.
Код: plaintext
1.
SELECT rn,name_nom,artikul,sum(cnt_portion) as PORTION,BRUTTO FROM currProdPay GROUP BY rn, name_nom,artikul,BRUTTO
В чем причина?
Попробуй не переделывать запрос для 9-ки.
В LOAD или INIT формы записать:
SET ENGINEBEHAVIOR 70
Если запрос отрабатывался хорошо в версиях 5,6,7, то теперь и в 9-ке отработает.
Ну если очень не хочется писать сеты и оставить все в 9-ке, то сделай из одного запроса два, и группировку оставь для второго запроса.
...
Рейтинг: 0 / 0
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36475188
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
прошелмимо,
спасибо, так работает. А как быть, если в селекте есть еще поля, которые в агрегировании не участвуют?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT rn, ;
       name_nom, ;
       sum(cnt_portion) as PORTION, ;
       Sum(BRUTTO), ;
       artikul;
    FROM currProdPay ;
    GROUP BY rn, name_nom
Так не работает, а если добавить поле в группировку, то само собой группировка уже не работает.
Group by работает только так (все не сгруппированные поля должны быть агрегатами)?
...
Рейтинг: 0 / 0
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36475197
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT rn, ;
       name_nom, ;
       sum(cnt_portion) as PORTION, ;
       Sum(BRUTTO), ;
       artikul;
    FROM currProdPay ;
    GROUP BY rn, name_nom, artikul
...
Рейтинг: 0 / 0
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36475681
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
прошелмимо
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT rn, ;
       name_nom, ;
       sum(cnt_portion) as PORTION, ;
       Sum(BRUTTO), ;
       artikul;
    FROM currProdPay ;
    GROUP BY rn, name_nom, artikul

Группировка по ключу, названию и артикулу. При условии, что один артикул связан только с одним ключом.. Так? А если он может повторяться для разных ключей (уникален только name_nom)? Может тогда
SET ENGINEBEHAVIOR 70
ставить, как igorbik предложил?
...
Рейтинг: 0 / 0
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36475706
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
донМахито,

Вам там у себя видней.

почему у макарон должен быть разны артику?
почему с разными артикулами все макароны должны сложиться?

ну и т.д. ,
на это Вы уже ответите самостоятельно.

примерами Вам продемонстрировано,
что рез-т зависит не от версии фокспро,
в которой Вы выполняете запрос,
а от корректности(правильности) составления запроса.

по ключу я подозреваю, что у Вас - Парус,
и Ваши пляски только начинаются,
поэтому обратите внимание на корректность написания запросов.

set engi behav применяют для быстрого перевода прил-й,
затем все-же переписывают в запросах группировку на явное указание
всех полей, не уч. в агрег. ф-ях., т.е. писать нужно придерживаясь
требований обновленного стандарта,
ну а там уж где явно "доктор прописал" дергаем установку и делаем так как нужно.
...
Рейтинг: 0 / 0
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36475772
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
прошелмимо,
"По умолчанию" при занесении нового продукта мнемокод (артикул) и название (name_nom) делают одним и тем же, если оно короткое -- размер артикула меньше названия, поэтому они могут не совпадать (обрезаться в артикуле). Плюс это "по умолчанию", тот кто заносит продукт может название записать по другому. Поэтому я и интересуюсь логикой группировки, т.к. не уверен, что понимаю правильно.
Еще раз: "объединяться в одну" будут только те записи, поля которых указаны в group by? Тогда в будущем стопудово стоит ждать ошибки.
...
Рейтинг: 0 / 0
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36476521
Kruchinin Pahan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
донМахитопрошелмимо,
"По умолчанию" при занесении нового продукта мнемокод (артикул) и название (name_nom) делают одним и тем же, если оно короткое -- размер артикула меньше названия, поэтому они могут не совпадать (обрезаться в артикуле). Плюс это "по умолчанию", тот кто заносит продукт может название записать по другому. Поэтому я и интересуюсь логикой группировки, т.к. не уверен, что понимаю правильно.
Еще раз: "объединяться в одну" будут только те записи, поля которых указаны в group by? Тогда в будущем стопудово стоит ждать ошибки.
Неа... Вам артикул стоит внести под агрегатную функцию.
MAX(artikul) или MIN(artikul), и вообще все поля, которые не участвуют в кортеже группировки должны быть под агрегатами. Тогда все будет корректно.

SET ENGINBEHAVIOR 70 и отсутствие агрегата на artikul будет выбирать "какой попало" артикул среди записей попадающих в группу. MAX в данном случае приводит к более ожидаемому результату.

Ну и кроме того, не стоит давать машине на откуп додумывание запросов за вас.
...
Рейтинг: 0 / 0
GROUP BY и агрегаты: варианты в разных версиях фокспро
    #36477171
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kruchinin Pahan
Неа... Вам артикул стоит внести под агрегатную функцию.
MAX(artikul) или MIN(artikul), и вообще все поля, которые не участвуют в кортеже группировки должны быть под агрегатами. Тогда все будет корректно.

Сделал так -- безуспешно. В итоге удалил артикул. В скане сделал проверку, чтобы rn сравнивалась с rn из первого курсора, из которого создавался данный.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / GROUP BY и агрегаты: варианты в разных версиях фокспро
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]