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

Занимаюсь сейчас тем что переписываю старый софт написанный на Фоксе на 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
30.12.2003, 14:05
    #32366937
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает GROUP BY в случае отступления от стандартов
Когда в 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
30.12.2003, 15:42
    #32367071
Urri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает GROUP BY в случае отступления от стандартов
Маленький комментарий: в случае когда Plan или Count в пределах группы могут иметь разные значения, FoxPro возьмет то значение, какое ему попадется "под руку" (не обязательно первое или последнее физически, ведь как таковой физический порядок в SQL не применим). В принципе, это отступление от стандарта позволяет писать более компактные по количеству кода запросы, но и является источником возникновения логических ошибок. ВладимирМ совершенно правильно охарактеризовал твою ситуацию как неверно построенный запрос. Я думаю, что в этом случае тебе надлежит абстрагироваться от кода и подняться на уровень бизнес-логики. И понять, а какова, собственно, роль этого запроса в приложении.
...
Рейтинг: 0 / 0
06.01.2004, 12:02
    #32369259
Как работает GROUP BY в случае отступления от стандартов
Покрайней мере в VFP6 всегда возвращалось последнее значение. Это если на основе только что сформированного курсора (используется в комерческам продукте и глюков замечено небыло), а что творится когда на таблицу да еще с индексами не знаю ...
...
Рейтинг: 0 / 0
24.02.2004, 12:28
    #32419196
Yras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает GROUP BY в случае отступления от стандартов
Вот ужас (((((
У себя сейчас проверил, запрос неверно отрабатывает данные.
Вопрос ко всем, разобраться не могу, туплю наверное, как реализовать правильно запрос такого типа:

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
24.02.2004, 13:11
    #32419286
Urri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает GROUP BY в случае отступления от стандартов
авторкак реализовать правильно запрос такого типа:

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
24.02.2004, 13:34
    #32419336
Yras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает GROUP BY в случае отступления от стандартов
Спасибо. К сожалению это решение к моей задаче не применимо:
Par_1, Par_N - их у меня полей 15 - это харектеристики товара не поддающиеся функции агрегатирования. Вообщем на русском задача звучит так: из остатков товара на складе сформировать прайс-лист в котором наименование и изготовитель уникальны, а цена минимальна.
...
Рейтинг: 0 / 0
24.02.2004, 13:36
    #32419342
Yras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает GROUP BY в случае отступления от стандартов
В догонку:
эта строка (с минимальной ценой) должа содержать характеристики товара именно этой строки...
...
Рейтинг: 0 / 0
24.02.2004, 14:16
    #32419433
Urri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает GROUP BY в случае отступления от стандартов
Если я правильно понял, то существуют несколько записей о, в общем, одном и том же товаре, но с разными параметрами. Это как при продаже автомобилей - есть некая базовая комплектация, на которую навешивается определенная дополнительная функциональность: цвет металлик - плюс 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
24.02.2004, 14:52
    #32419529
Yras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает GROUP BY в случае отступления от стандартов
Благодарствую, действительно нужна была идея. Бум копать.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как работает GROUP BY в случае отступления от стандартов / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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