powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как работает GROUP BY в случае отступления от стандартов
10 сообщений из 10, страница 1 из 1
Как работает GROUP BY в случае отступления от стандартов
    #32366891
Newb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нормальные люди уже "оливье" готовят а я все на работе парюсь :((

Занимаюсь сейчас тем что переписываю старый софт написанный на Фоксе на MS-SQL.
Проблема с пониманием работы GROUP BY в случае отступления от стандартов.

Вот на Фоксе:

SELECT Data, Name, Plan, Count;
FROM Cursor1;
GROUP BY 2, 1;

Естественно что на SQL я так написать не могу.
Приходится писать GROUP BY Data, Name, Plan, Count
Результат получается отличным от того что требуется (это и понятно - условия группировки то другие).

Вопросы:

1. Что Фокс выдает в качестве результата группировки если не указана группировка по неагрегатному полю? Иными словами что он выдаст в приведенном премере в качестве Plan и Count? Я что-то не пойму логику. Предположил было что первое из встретившихся значений, но проверка показала что нет.

2. А как быть в таком случае на MS-SQL? Единственное что приходит мне в голову это сперва делать
SELECT Data, Name, 0 AS Plan, 0 AS Count
FROM Tab1 GROUP BY Data, Name
а затем загонять таблицу Tab1 в курсор и апдейтить результат выборки подставляя первые Plan и Count соответствующие условию. Но способ очень медленный. Да и не за тем используется SQL чтобы гонять на нем курсоры.

3. Суммируя два предыдущих вопроса как написать на SQL выборку соответствующую Фоксовской???

Огромнейшее спасибо.

P.S. Все таки стандарты это хорошо !!!!!
P.P.S. Всех с наступающим на пятки Новым Годом !
...
Рейтинг: 0 / 0
Как работает GROUP BY в случае отступления от стандартов
    #32366937
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда в FoxPro используется синтаксис типа

Код: plaintext
1.
2.
SELECT Data, Name, Plan, Count; 
FROM Cursor1; 
GROUP BY  2 ,  1 


То при этом предполагается, что значение полей Plan, Count одинаково в пределах одной группы (при одинаковых значениях Data и Name). Т.е. абсолютно все-равно какое именно значение будет взято, поскольку оно будет одинаковое.

Это значит, что вместо полей Plan и Count можно указать любую функцию аггрегирования и это никак не повлияет на результат. Ну например:

Код: plaintext
1.
2.
SELECT Data, Name, MIN(Plan) as Plan, MAX(Count) as Count; 
FROM Cursor1; 
GROUP BY  2 ,  1 


Если кроме перечисленных полей есть какие-либо функции аггрегирования, то можно просто включить список этих полей в список GROUP BY. Результат будет тот же.

Если же в приложении FoxPro заложились на то, что в пределах одной группы значение полей Plan и Count может быть различно (кажется берется последнее значение из группы, хотя не уверен), то это неверно построенный запрос. Просто нельзя ориентироваться на физическое расположение записей в операторах Select-SQL
...
Рейтинг: 0 / 0
Как работает GROUP BY в случае отступления от стандартов
    #32367071
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маленький комментарий: в случае когда Plan или Count в пределах группы могут иметь разные значения, FoxPro возьмет то значение, какое ему попадется "под руку" (не обязательно первое или последнее физически, ведь как таковой физический порядок в SQL не применим). В принципе, это отступление от стандарта позволяет писать более компактные по количеству кода запросы, но и является источником возникновения логических ошибок. ВладимирМ совершенно правильно охарактеризовал твою ситуацию как неверно построенный запрос. Я думаю, что в этом случае тебе надлежит абстрагироваться от кода и подняться на уровень бизнес-логики. И понять, а какова, собственно, роль этого запроса в приложении.
...
Рейтинг: 0 / 0
Как работает GROUP BY в случае отступления от стандартов
    #32369259
Покрайней мере в VFP6 всегда возвращалось последнее значение. Это если на основе только что сформированного курсора (используется в комерческам продукте и глюков замечено небыло), а что творится когда на таблицу да еще с индексами не знаю ...
...
Рейтинг: 0 / 0
Как работает GROUP BY в случае отступления от стандартов
    #32419196
Yras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот ужас (((((
У себя сейчас проверил, запрос неверно отрабатывает данные.
Вопрос ко всем, разобраться не могу, туплю наверное, как реализовать правильно запрос такого типа:

Select Name_tv, Izgot, Min(Cena+Nac) as Cena, Par_1, Par_2;
From Sklad;
Group by Name_tv, Izgot;
into table Uni_Name_Izgot

Чтобы в результирующую таблицу выводились строки с минимальной ценой
но сооветсвующими параметрами Par_1, Par_2 именно для этих строк
...
Рейтинг: 0 / 0
Как работает GROUP BY в случае отступления от стандартов
    #32419286
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторкак реализовать правильно запрос такого типа:

Select Name_tv, Izgot, Min(Cena+Nac) as Cena, Par_1, Par_2;
From Sklad;
Group by Name_tv, Izgot;
into table Uni_Name_Izgot

Есть только два пути: или объявить Par_1 и Par_2 полями группировки, или объявить их полями агрегирования. В первом случае запрос примет такой вид:
Код: plaintext
1.
2.
3.
Select Name_tv, Izgot, Min(Cena+Nac) as Cena, Par_1, Par_2; 
From Sklad; 
Group by Name_tv, Izgot,Par_1, Par_2 ; 
into table Uni_Name_Izgot


Во втором - например, такой:
Код: plaintext
1.
2.
3.
Select Name_tv, Izgot, Min(Cena+Nac) as Cena, min(Par_1) as minpar1, avg(Par_2) as avgpar2; 
From Sklad; 
Group by Name_tv, Izgot,Par_1, Par_2 ; 
into table Uni_Name_Izgot


А вот как надо - это вам решать. Исходя из постановки задачи.
...
Рейтинг: 0 / 0
Как работает GROUP BY в случае отступления от стандартов
    #32419336
Yras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. К сожалению это решение к моей задаче не применимо:
Par_1, Par_N - их у меня полей 15 - это харектеристики товара не поддающиеся функции агрегатирования. Вообщем на русском задача звучит так: из остатков товара на складе сформировать прайс-лист в котором наименование и изготовитель уникальны, а цена минимальна.
...
Рейтинг: 0 / 0
Как работает GROUP BY в случае отступления от стандартов
    #32419342
Yras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В догонку:
эта строка (с минимальной ценой) должа содержать характеристики товара именно этой строки...
...
Рейтинг: 0 / 0
Как работает GROUP BY в случае отступления от стандартов
    #32419433
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понял, то существуют несколько записей о, в общем, одном и том же товаре, но с разными параметрами. Это как при продаже автомобилей - есть некая базовая комплектация, на которую навешивается определенная дополнительная функциональность: цвет металлик - плюс 100 долларов, наличие крутой аудиосистемы - еще двести... И вот получается, что в вашем случае нет базовой комплектации, а вместо нее есть сочетание параметров, дающее минимальную цену. И в запросе задача - выдать значения этих параметров рядом с каждой минимальной ценой. Ну так нет ничего проще ;-)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Select Name_tv, Izgot, Cena+Nac as Cena, Par_1, Par_2, ... ;
  From Sklad ;
 where Name_tv+Izgot+str(Cena+Nac, 15 , 5 ) in ;
   (Select Name_tv+Izgot+str(min(Cena+Nac), 15 , 5 ) ;
      From Sklad ;
  Group by Name_tv, Izgot ;
   ) ;
into table Uni_Name_Izgot


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


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