|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
Во время работы возникла ошибка: Group by is missing or invalid. При этом в селекте есть агрегат по полю (sum()). Работаю в 9м фоксе. Нашел здесь интересную тему. Оказывается в разных версиях фокса подобные ситуации воспринимаются по разному. Чтобы переделать запрос для 9ки нужно группировать по всем полям селекта, исключая агрегатное. Сделал -- ошибки нет, но и ожидаемого результата тоже: он только группирует одинаковые записи, а не объединяет их в одну. Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 10:59 |
|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
донМахито он только группирует одинаковые записи, а не объединяет их в одну. Переведите на общепонятный язык. Что Вы ожидаете и что происходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 11:03 |
|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
чтобы Вам правильно ответили: 1. покажите тестовую табличку с данными 2. нарисуйте и опишите требуемый результат ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 11:11 |
|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
Исходная табличка, отобрана в курсор currProdPay: rn,name_nom,artikul,cnt_portion,BRUTTO Выводит (привожу основные поля): Молоко 10 Масло 5 Масло 5 Морковь 2 Мясо 100 Мясо 100 Картофель 50 Некоторые поля повторяются. Нужно все повторяющиеся поля заменить одним и сложить все их соответствующие поля: Молоко 10 Масло 10 Морковь 2 Мясо 200 Картофель 50 Сейчас он ничего не делает -- только группирует. Даже без group by не работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 11:35 |
|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
донМахитоИсходная табличка, отобрана в курсор currProdPay: rn,name_nom,artikul,cnt_portion,BRUTTO Выводит (привожу основные поля): Молоко 10 Масло 5 Масло 5 Морковь 2 Мясо 100 Мясо 100 Картофель 50 Некоторые поля повторяются. Нужно все повторяющиеся поля заменить одним и сложить все их соответствующие поля: Молоко 10 Масло 10 Морковь 2 Мясо 200 Картофель 50 Сейчас он ничего не делает -- только группирует. Даже без group by не работает.Вы можете наконец ответить, что в Вашем понимании есть "группирует"? Как ЭТО выгдлядит? Или первый список и есть "группировка"? Если так, то каковы неосновные поля? Например, у строк с маслом они одинаковые или отличаются? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 11:42 |
|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
авторВыводит (привожу основные поля): нужно не только основные, а и все, все, так как если поле rn уникальное, то и не будет группировки ttpp kk10 20 3015 16 20 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 11:43 |
|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
дайте нам таблички в таком виде, в котором я нарисовал это теги CSV /CSV rnname_nomartikulcnt_portionBRUTTO1ffffffffhh455 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 11:45 |
|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
проходящий.Вы можете наконец ответить, что в Вашем понимании есть "группирует"? Как ЭТО выгдлядит? Блин, я же пример привел. Есть список продуктов. Некоторые продукты повторяются, но с разными значениями: количество порций, брутто. Нужно вывести общее количество порций и брутто для каждого продукта. прошелмимо, 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 12:10 |
|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
*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 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 12:13 |
|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
Не получилось. Черт. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 12:16 |
|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
донМахитопроходящий.Вы можете наконец ответить, что в Вашем понимании есть "группирует"? Как ЭТО выгдлядит? Блин, я же пример привел.Блин, это Вам только кажется. Есть список продуктов. Некоторые продукты повторяются, но с разными значениями: количество порций, брутто. Нужно вывести общее количество порций и брутто для каждого продукта. 000p;Масло;5;3 000p;Масло;10;2 Ну вот и объяснение. ЭТО для компа РАЗНЫЕ группы. У него нет основных и неосновных полей для группировки. Он группирует по ВСЕМ указанным в group by полям без деления на основные и неосновные. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 12:19 |
|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 12:27 |
|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
донМахитоВо время работы возникла ошибка: Group by is missing or invalid. При этом в селекте есть агрегат по полю (sum()). Работаю в 9м фоксе. Нашел здесь интересную тему. Оказывается в разных версиях фокса подобные ситуации воспринимаются по разному. Чтобы переделать запрос для 9ки нужно группировать по всем полям селекта, исключая агрегатное. Сделал -- ошибки нет, но и ожидаемого результата тоже: он только группирует одинаковые записи, а не объединяет их в одну. Код: plaintext 1.
Попробуй не переделывать запрос для 9-ки. В LOAD или INIT формы записать: SET ENGINEBEHAVIOR 70 Если запрос отрабатывался хорошо в версиях 5,6,7, то теперь и в 9-ке отработает. Ну если очень не хочется писать сеты и оставить все в 9-ке, то сделай из одного запроса два, и группировку оставь для второго запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 14:25 |
|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
прошелмимо, спасибо, так работает. А как быть, если в селекте есть еще поля, которые в агрегировании не участвуют? Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Group by работает только так (все не сгруппированные поля должны быть агрегатами)? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 14:33 |
|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 14:35 |
|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
прошелмимо Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Группировка по ключу, названию и артикулу. При условии, что один артикул связан только с одним ключом.. Так? А если он может повторяться для разных ключей (уникален только name_nom)? Может тогда SET ENGINEBEHAVIOR 70 ставить, как igorbik предложил? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 16:54 |
|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
донМахито, Вам там у себя видней. почему у макарон должен быть разны артику? почему с разными артикулами все макароны должны сложиться? ну и т.д. , на это Вы уже ответите самостоятельно. примерами Вам продемонстрировано, что рез-т зависит не от версии фокспро, в которой Вы выполняете запрос, а от корректности(правильности) составления запроса. по ключу я подозреваю, что у Вас - Парус, и Ваши пляски только начинаются, поэтому обратите внимание на корректность написания запросов. set engi behav применяют для быстрого перевода прил-й, затем все-же переписывают в запросах группировку на явное указание всех полей, не уч. в агрег. ф-ях., т.е. писать нужно придерживаясь требований обновленного стандарта, ну а там уж где явно "доктор прописал" дергаем установку и делаем так как нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 17:05 |
|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
прошелмимо, "По умолчанию" при занесении нового продукта мнемокод (артикул) и название (name_nom) делают одним и тем же, если оно короткое -- размер артикула меньше названия, поэтому они могут не совпадать (обрезаться в артикуле). Плюс это "по умолчанию", тот кто заносит продукт может название записать по другому. Поэтому я и интересуюсь логикой группировки, т.к. не уверен, что понимаю правильно. Еще раз: "объединяться в одну" будут только те записи, поля которых указаны в group by? Тогда в будущем стопудово стоит ждать ошибки. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 17:34 |
|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
донМахитопрошелмимо, "По умолчанию" при занесении нового продукта мнемокод (артикул) и название (name_nom) делают одним и тем же, если оно короткое -- размер артикула меньше названия, поэтому они могут не совпадать (обрезаться в артикуле). Плюс это "по умолчанию", тот кто заносит продукт может название записать по другому. Поэтому я и интересуюсь логикой группировки, т.к. не уверен, что понимаю правильно. Еще раз: "объединяться в одну" будут только те записи, поля которых указаны в group by? Тогда в будущем стопудово стоит ждать ошибки. Неа... Вам артикул стоит внести под агрегатную функцию. MAX(artikul) или MIN(artikul), и вообще все поля, которые не участвуют в кортеже группировки должны быть под агрегатами. Тогда все будет корректно. SET ENGINBEHAVIOR 70 и отсутствие агрегата на artikul будет выбирать "какой попало" артикул среди записей попадающих в группу. MAX в данном случае приводит к более ожидаемому результату. Ну и кроме того, не стоит давать машине на откуп додумывание запросов за вас. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2010, 05:51 |
|
GROUP BY и агрегаты: варианты в разных версиях фокспро
|
|||
---|---|---|---|
#18+
Kruchinin Pahan Неа... Вам артикул стоит внести под агрегатную функцию. MAX(artikul) или MIN(artikul), и вообще все поля, которые не участвуют в кортеже группировки должны быть под агрегатами. Тогда все будет корректно. Сделал так -- безуспешно. В итоге удалил артикул. В скане сделал проверку, чтобы rn сравнивалась с rn из первого курсора, из которого создавался данный. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2010, 12:08 |
|
|
start [/forum/topic.php?fid=41&msg=36474570&tid=1585585]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
5ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 162ms |
0 / 0 |