SELECT, агрегирующая функция и GROUP BY | |
---|---|
ProbaSP Автор Сообщений: 94 Откуда: Урал Дата регистрации: 28.01.2016 |
Привет Всем!
Вот рабочий пример запроса:
НО теперь в созданном курсоре(kVibor) значения полей company, country перегруппировались, а нужно чтоб остались в том порядке в каком были в таблице Customer(это, к сожалению, для меня важно ). Подскажите, как можно решить этот вопрос...(или ткните, где это уже разбиралось) Спасибо. VFP9 SP2 |
Re: SELECT, агрегирующая функция и GROUP BY | |
---|---|
PaulWist Сообщений: 14618 Дата регистрации: 01.04.2004 |
Дык, репо код приведи, типа было так, стало так, а надо вот так.
------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
Re: SELECT, агрегирующая функция и GROUP BY | |
---|---|
of63 Сообщений: 25254 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Если исходная таблица DBF, то RECNO() записей также извлеки, и по нему ORDER-ни
|
Re: SELECT, агрегирующая функция и GROUP BY | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Никак нельзя сохранить какой-то "физический порядок" даже в неагрегирующем запросе. SQL НЕ работает с такими понятиями - для него все записи "строки" равнозначны и НЕупорядочены - движок выполнения запроса не обязан их просматривать "в физическом порядке" или в каком-то "индексном" заданном через SET ORDER.
Нужно сделать нормальный ID или что-то типа того, включить его в запрос (например используя функции MIN() или MAX() - группировать по нему не нужно) и использовать в опции ORDER BY. В принципе можно использовать в качестве такого id функцию recno() побаловавшись с подзапросами - но это решение глубоко через ж*** (велика вероятность что сделать стабильно работающий запрос ты не сможешь, только усложнишь себе жизнь последующим отловом непредсказуемых ошибок), и для целей использования в рабочем коде крайне не советую. Если уж совсем плохо, то хотя бы за 2 запроса это делай - в первом просто выборка в курсор всех нужных полей плюс RECNO() и строго из ОДНОЙ таблицы (в однотабличных запросах RECNO() без параметров худо-бедно работает, и можно пойти на такую "некрасивость"). А уже во втором запросе и делать выборку с MAX(это_вычисленное_поле) и ORDER BY 1 ну или какое оно там по порядку окажется. При этом надо решить какой порядок будет правильным. Т.к. в таблице запросто может быть записано (для простоты только страну возьмём, для 2 полей ситуация аналогична) "RU", 10 "US", 20 "US", 24 "RU", 33 Ну и какой по порядку в агрегирующем запросе должна быть RU - первой или последней? В зависимости от этого и выбирай функцию MAX или MIN, или даже AVG если нужна особо хитро-вывернутая сортировка, скажем "большинство RU записей было в исходной таблице в начале, значит его первым ставим". ------------------ WBR, Igor |
Re: SELECT, агрегирующая функция и GROUP BY | |
---|---|
ProbaSP Автор Сообщений: 94 Откуда: Урал Дата регистрации: 28.01.2016 |
Спасибо!
С RECNO() все получилось.
По крайней мере результат меня устраивает... Исправлено 1 раз(а). Последнее : ProbaSP, 17.11.17 15:54 |
Re: SELECT, агрегирующая функция и GROUP BY | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
При группировке по recno пропадает всяческий смысл в агрегации.
Впрочем, смысла в конструкции MAX(.f.) as vibor тоже нет совершенно никакого. Для создания нового поля из константного значения не нужна агрегирующая функция, даже в запросе с группировкой. Т.е. либо изначально в этом запросе не нужна никакая группировка (если сочетание полей company, country всегда уникально для данной таблицы), либо запрос попросту не будет ничего агрегировать, т.е. не будет убирать "дубликаты" в сочетаниях компании и страны. Пример, сразу с ПРАВИЛЬНЫМ решением, включающим изменение структуры исходной таблицы - чтобы "порядок записей" определялся по содержимому конкретного поля, а не по "физическому порядку".
Если в таблице изначально дублей (по этим 2 полям) нет, то достаточно тривиального
------------------ WBR, Igor |
Re: SELECT, агрегирующая функция и GROUP BY | |
---|---|
of63 Сообщений: 25254 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Да, не понятно, зачем ТС затеял группировку. Обычно это нужно, чтобы просуммировать деньги например, для каждой пары {страна, кампания}, и обычно порядок неважен... Может ТС хотел просто упорядочить... но зачем тогда " нужно чтоб остались в том порядке в каком были в таблице Customer"
|
Re: SELECT, агрегирующая функция и GROUP BY | |
---|---|
ProbaSP Автор Сообщений: 94 Откуда: Урал Дата регистрации: 28.01.2016 |
Ну вообще разобрался...
собственно, мне ни какая группировка-то не нужна. просто когда-то of63 мне показал пример, как можно добавить "столбец" (значения в нём должны были быть 1 или 0) при запросе. поэтому
вот я и запутался(вернее сам себя запутывал)... а вы мне тут всё разжевали и ещё определили что она там не нужна(группировка)! ВСЕМ ОГРОМНОЕ СПАСИБО! p.s. убрал MAX(), GROUP BY. И про RECNO() опыт добавился. а оказывается делов-то:
|
Re: SELECT, агрегирующая функция и GROUP BY | |
---|---|
of63 Сообщений: 25254 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Что за "MAX(.f.) as vibor" я проповедовал?
|
Re: SELECT, агрегирующая функция и GROUP BY | |
---|---|
Simple777 Сообщений: 33855 Дата регистрации: 05.11.2006 |
Таковы гении - порождая новые смыслы, теряют в дальнейшем к ним интерес и предают забвению!.. И только изумлённые потомки спустя многия годы постигают смысл извергнутого. |
© 2000-2024 Fox Club  |